GNU/Linux >> LINUX-Kenntnisse >  >> Linux

YAML für Ansible verstehen

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.


Linux
  1. Wie ich Ansible und Anacron für die Automatisierung verwende

  2. YAML für Anfänger

  3. Entmystifizierung von Ansible für Linux-Systemadministratoren

  4. Verstehen von loff_t *offp für file_operations

  5. Wie kann ich mit Ansible auf den Neustart des Servers warten?

Ansible Guide:Ansible Playbook für LEMP Stack erstellen

So erstellen Sie Ansible Playbooks für die IT-Automatisierung

5 Tipps zur Konfiguration von virtualenvs mit Ansible Tower

Kurzanleitung zu Ansible für Linux-Systemadministratoren

RHCE Ansible Series #3:Ansible Playbooks

Die for-Schleife in Shell-Skripten verstehen