Wenn Sie Ansible-Playbooks schreiben oder verwenden, sind Sie es gewohnt, YAML-Konfigurationsdateien zu lesen. YAML kann täuschend einfach und gleichzeitig seltsam überwältigend sein, besonders wenn Sie die endlos möglichen Ansible-Module berücksichtigen, die Ihnen zur Verfügung stehen. Es fühlt sich an, als sollte es einfach sein, ein paar Optionen in einer YAML-Datei zu notieren und dann Ansible auszuführen, aber welche Optionen benötigt Ihr Lieblingsmodul? Und warum sind einige Schlüssel-Wert-Paare, während andere Listen sind?
YAML für Ansible kann komplex werden, daher ist es wichtig zu verstehen, wie Ansible-Module in YAML übersetzt werden, um in beidem besser zu werden. Bevor Sie verstehen können, wie YAML für Ansible-Module funktioniert, müssen Sie die Grundlagen von YAML verstehen.
Wenn Sie den Unterschied zwischen einem Zuordnungsblock und einem Sequenzblock in YAML nicht kennen, lesen Sie diesen Artikel zur schnellen Einführung in die Grundlagen von YAML.
Befehlssyntax
Abgesehen von der Ad-hoc-Nutzung wird Ansible über Playbooks verwendet . Ein Playbook besteht aus einem oder mehreren Plays in einer geordneten Liste (eine YAML-Sequenz ). Jeder Spielzug kann eine oder mehrere Aufgaben ausführen , und jede Aufgabe ruft ein Ansible-Modul auf.
Ansible-Module sind im Grunde Frontends für Befehle. Wenn Sie mit dem Linux-Terminal oder der Powershell von Microsoft vertraut sind, wissen Sie, wie Sie einen Befehl mithilfe von Optionen (wie --long
) erstellen oder -s
) zusammen mit Argumenten (auch Parameter genannt ).
Hier ist ein einfaches Beispiel:
$ mkdir foo
Dieser Befehl verwendet das mkdir
Befehl zum Erstellen eines Verzeichnisses namens foo
.
Ein Ansible-Playbook erstellt auch Befehle. Es sind die gleichen Befehle, aber sie werden mit einer anderen Syntax aufgerufen, als Sie es von einem Terminal gewohnt sind.
[ Das könnte Ihnen auch gefallen: Erste Schritte mit Ansible ]
Ansible-Module und YAML
Als Aufgabe in einem Ansible-Playbook ist die Syntax jedoch sehr unterschiedlich. Zuerst wird dem Stück ein Name gegeben, der eine für Menschen lesbare Beschreibung dessen ist, was aufgeführt wird. Ein Spiel akzeptiert viele Schlüsselwörter, einschließlich hosts
um einzuschränken, auf welchen Hosts es ausgeführt werden soll und remote_user
um den Benutzernamen zu definieren, den Ansible verwenden muss, um auf entfernte Hosts zuzugreifen.
Schlüsselwörter für Spiele werden von Ansible selbst definiert, und es gibt eine Liste von Schlüsseln (und die Arten von Informationen, die jeder als seinen Wert erwartet) in der Dokumentation zu Ansible Play Keywords .
Diese Schlüssel sind keine separaten Listenelemente. In der YAML-Terminologie sind sie Zuordnungen eingebettet in die Wiedergabe sequenz .
Hier ist eine einfache Spielerklärung:
---
- name: “Create a directory”
hosts: localhost
Der letzte Zuordnungsblock in einer Spielerklärung sind die tasks
Schlüsselwort, das eine neue Sequenz öffnet, um zu definieren, welches Ansible-Modul das Spiel ausführen wird und mit welchen Argumenten. Hier verwenden Sie vertraute Befehle auf eine ungewohnte, YAML-ifizierte Weise. Tatsächlich ist es Ihnen so ungewohnt, dass Sie wahrscheinlich das Modul lesen müssen, um herauszufinden, welche Argumente es von Ihnen erwartet.
In diesem Beispiel verwende ich das integrierte Dateimodul. Aus der Dokumentation des Moduls können Sie ersehen, dass der erforderliche Parameter path
ist , die einen gültigen POSIX-Dateipfad erwartet. Ausgestattet mit diesen Informationen können Sie ein sehr einfaches Ansible-Playbook erstellen, das wie folgt aussieht:
---
- name: "Create a directory"
hosts: localhost
tasks:
- name: "Instantiate"
file:
path: "foo"
Wenn Sie sich immer noch an die Bedeutung der Einrückung von YAML gewöhnen, beachten Sie, dass der Name der Aufgabe nicht relativ zu tasks
eingerückt ist weil name
ist der Beginn eines neuen YAML-Sequenzblocks (der zufällig als Wert für die tasks
dient Schlüssel). Das Wort file
gibt an, welches Modul verwendet wird, das Teil der Aufgabendefinition ist, und path
ist ein erforderlicher Parameter der file
Modul.
Mit anderen Worten, die Aufgabe eines Stücks ist ein YAML-Sequenzblock (dh eine geordnete Liste) von Definitionen, die ein Modul und seine Parameter aufrufen.
Sie können diese Wiedergabe testen, um sicherzustellen, dass sie wie erwartet funktioniert, aber führen Sie zuerst yamllint
aus darauf, um syntaktische Überraschungen zu vermeiden:
$ yamllint folder.yaml || echo “fail”
$ ansible-playbook folder.yaml
[…]
TASK [Instantiate] ******************
fatal: [localhost]:
FAILED! => {“changed”: false,
“msg”: “file (foo) is absent, cannot continue” …
Das Playbook wurde verarbeitet, aber die Aufgabe ist fehlgeschlagen. Durchlesen der Parameterliste der file
-Modul zeigt, dass sein Verhalten weitgehend vom Wert von state
abhängt . Insbesondere besteht die Standardaktion darin, den Status von path
zurückzugeben .
Ändern Sie Ihre YAML-Beispieldatei so, dass sie einen state
enthält Zuordnung:
---
- name: "Create a directory"
hosts: localhost
tasks:
- name: "Instantiate"
file:
path: "foo"
state: directory
Führen Sie es erneut aus, um erfolgreich zu sein:
$ yamllint folder.yaml || echo “fail”
$ ansible-playbook folder.yaml
[…]
$ ls
foo
Steuermodule
Nicht alle Ansible-Module werden direkt einem einzelnen Befehl zugeordnet. Einige Module ändern, wie Ansible Ihr Playbook verarbeitet. Zum Beispiel with_items
module listet Elemente auf, mit denen ein anderes Modul arbeiten soll. Sie können es sich als eine Art do while
vorstellen oder for
Schleife.
Die Dokumentation zeigt, dass es nur einen Parameter akzeptiert:eine Liste von Elementen. Eine „Liste“ in der YAML-Terminologie ist eine Sequenz , sodass Sie wissen, ohne sich den Beispielcode in der Dokumentation anzusehen, dass jedes Element mit einem Leerzeichen beginnen muss (-
).
Hier ist eine neue Iteration der Ordnererstellung, diesmal mit mehreren Unterordnern (unter Verwendung von recurse
Parameter in der file
Modul) und einen zusätzlichen Parameter zum Festlegen von Dateiberechtigungen. Lassen Sie sich nicht von den zusätzlichen Zeilen täuschen. Dies ist im Wesentlichen derselbe Code wie zuvor, nur mit zusätzlichen Parametern, wie in der file
beschrieben Moduldokumentation, plus with_items
Modul zum Aktivieren der Iteration:
---
- name: "Create directory structure"
hosts: localhost
tasks:
- name: "Instantiate"
file:
path: "{{ item }}"
recurse: true
mode: "u=rwx,g=rwx,o=r"
state: directory
with_items:
- "foo/src"
- "foo/dist"
- "foo/doc"
Führen Sie das Playbook aus, um die Ergebnisse anzuzeigen:
$ yamllint folder.yaml
$ ansible-playbook folder.yaml
[…]
$ ls foo
dist doc src
[ Brauchen Sie mehr zu Ansible? Nehmen Sie an einem kostenlosen technischen Überblickskurs von Red Hat teil. Ansible Essentials:Einfachheit in der Automatisierung Technischer Überblick. ]
Ansible-Prinzipien
Ein Ansible-Playbook ist eine YAML-Sequenz , die selbst aus Mappings besteht und Sequenzen .
Playbooks enthalten auch Ansible-Module, die jeweils vom Entwickler definierte Parameter akzeptieren. Sowohl erforderliche als auch optionale Parameter sind in der Dokumentation eines Moduls aufgelistet.
Um ein Ansible-Playbook zu erstellen, starten Sie eine YAML-Sequenz, die das Stück benennt und dann (in einer Sequenz) eine oder mehrere Aufgaben auflistet. In jeder Aufgabe können ein oder mehrere Module aufgerufen werden.
Achten Sie genau auf die Einrückung, indem Sie verstehen, welche Art von Daten Sie in Ihre YAML-Datei eingeben. Es könnte helfen, zu vermeiden Denken Sie an Einrückungen als Hinweis auf logische Vererbung und betrachten Sie stattdessen jede Zeile als ihren YAML-Datentyp (d. h. eine Sequenz oder eine Zuordnung).
Verwenden Sie yamllint
um Ihre YAML-Dateien zu überprüfen.
Sobald Sie die Struktur eines Playbooks verstanden haben, müssen Sie nur noch der Moduldokumentation folgen, um die Aufgaben auszuführen, die Ihr Playbook ausführen soll. Es sind Hunderte von Modulen verfügbar, also fangen Sie an, sie zu erkunden und sehen Sie, welche erstaunlichen Dinge Sie mit diesem erstaunlichen Tool tun können.