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

So verwenden Sie Schleifen im Ansible Playbook

Im Verlauf der Ausführung von Aufgaben im Ansible Playbook , stoßen Sie möglicherweise auf Aufgaben, die sich wiederholen. Dies sind Aufgaben, bei denen Sie mehrere Spiele erstellen müssen, was ziemlich mühsam sein kann. Wie bei jeder Programmiersprache bieten Schleifen in Ansible eine einfachere Möglichkeit, sich wiederholende Aufgaben mit weniger Codezeilen in einem Playbook auszuführen.

Beim Erstellen von Schleifen stellt Ansible diese beiden Anweisungen bereit:loop und mit_* Schlüsselwort.

Das Schlüsselwort loop wurde kürzlich zu Ansible 2.5 hinzugefügt . Das Schlüsselwort loop wird normalerweise verwendet, um einfache Standardschleifen zu erstellen, die mehrere Elemente durchlaufen.

Die with_*  Das Schlüsselwort wird mit einer Reihe von Lookup-Plugins verwendet, wenn Werte durchlaufen werden. Lookup-Plug-ins ermöglichen Ansible den Zugriff auf Informationen aus externen Quellen wie externen Datenspeichern, Dateisystemen usw. Die with_* lookup wird immer noch sehr häufig verwendet und ist noch nicht veraltet.

Schauen wir uns nun an, wie Sie Loops in Ansible implementieren können.

Iteration über einfache Schleifen 

Stellen Sie sich ein Playbook vor, das einen neuen Benutzer auf dem Zielsystem hinzufügt, indem das Benutzermodul wie gezeigt verwendet wird:

---
- hosts: ubuntu_webserver
  tasks:
    - name: Create new user john
      user:
        name: john
        state: present

Das sieht in Ordnung aus. Was aber, wenn wir mehrere Benutzer zum Zielsystem hinzufügen müssen? Wie würden wir vorgehen? Eine Möglichkeit wäre, die Aufgaben zu duplizieren, wie im Beispiel unten gezeigt, wo wir 3 Benutzer hinzufügen.

---
- hosts: ubuntu_webserver
  tasks:
    - name: Create new user john
      user:
        name: john
        state: present

    - name: Create new user mike
      user:
        name: mike
        state: present

    - name: Create new user andrew
      user:
        name: andrew
        state: present

Wie Sie sehen können, erfordert dies eine Menge Vervielfältigung und Wiederholung.

Zur Vereinfachung kann das gleiche Playbook mit der loop-Direktive geschrieben werden. Die Loop-Direktive führt dieselbe Aufgabe mehrmals aus. Es speichert den Wert jedes Elements in einer Variablen namens item .Anstatt also die Namen der hinzuzufügenden Benutzer anzugeben, geben Sie einfach eine Variable namens item an, die wie gezeigt zwischen doppelten geschweiften Klammern eingeschlossen ist.

name:‘{{ item }}’

Daher wird jedes der Elemente innerhalb der Schleife durch die Variable referenziert.

Wie Sie sehen können, ist unser Playbook jetzt viel besser organisiert mit unnötigen Duplizierungen/Wiederholungen.

$ vi create_users.yaml
---
- hosts: ubuntu_webserver
  tasks:
    - name: Create new users
      user:
        name: '{{ item }}'
        state: present
      loop:
        - john
        - mike
        - andrew

Sie können auch with_items verwenden Direktive anstelle der Schleifendirektive. Beide führen zum gleichen Ergebnis.

---
- hosts: ubuntu_webserver
  become: yes
  tasks:
    - name: Create new users
      user:
        name: '{{ item }}'
        state: present

      with_items:
        - john
        - mike
        - andrew

Sie können jetzt das Playbook ausführen, um die Benutzer mit dem ansible-playbook zu erstellen Befehl wie unten gezeigt:

$ ansible-playbook -i inventory.txt create_users.yaml

Iteration über eine Liste von Wörterbüchern

Im ersten Beispiel haben wir uns eine einfache Standardschleife angesehen, bei der das Array eine Liste von Zeichenfolgenwerten war, die Benutzer darstellten, die dem entfernten Ziel hinzugefügt werden sollten.

Aber was ist, wenn wir die uid hinzufügen müssen in die Schleife, sodass jedes Element jetzt zwei Werte hat:den Benutzernamen und uid . Wie würden Sie 2 Werte in einem Array übergeben?

In diesem Szenario müssen Sie ein Array von Wörterbüchern übergeben, jedes mit zwei Schlüssel-Wert-Paaren, wie gezeigt. Die Schlüssel wären der Name und die UID, während die Werte der Benutzername und die ID jedes Benutzers sind.

Unter „Aufgaben ‘ Abschnitt können Sie die Variable item nicht mehr wie bisher definieren. Da wir zwei Werte haben, wird dies in zwei Variablen übersetzt:item.name &item.uid .

Das vollständige Playbook wird unten angezeigt:

$ vi create_users.yaml
---
- hosts: ubuntu_webserver
  become: yes
  tasks:
    - name: Create new users
      user:
        name: '{{ item.name }}'
        uid: '{{ item.uid }}'
        state: present

      loop:
        - name: john
          uid: 1020
        - name: mike
          uid: 1030
        - name: andrew
          uid: 1040

Das Array von Wörterbüchern kann auch in einem JSON-Format dargestellt werden.

loop:
  - { name: john , uid: 1020 }
  - { name: mike , uid: 1030 }
  - { name: andrew , uid: 1040}

Bei der Ausführung erhalten Sie die folgende Ausgabe:

$ ansible-playbook -i inventory.txt create_users.yaml

Ansible Loops mit Indizes

Gelegentlich möchten Sie vielleicht die Indexwerte in Ihrem Array von Elementen verfolgen. Verwenden Sie dazu die Datei „with indexed_items ' nachschlagen. Der Indexwert beginnt bei 0, während der Schleifenindex bei item.0 beginnt und den Wert aus item.1

Betrachten Sie das folgende Playbook:

$ vi indexes.yaml
---
- hosts: ubuntu_webserver
  tasks:
  - name: Indexes with Ansible loop
    debug:
      msg: "The car at {{ item.0 }} is {{ item.1 }}"
    with_indexed_items:
      - "Nissan"
      - "Mercedes"
      - "Toyota"
      - "Mazda"
      - "BMW"

Bei der Ausführung zeigt das Playbook den Indexwert jedes Elements in der Array-Liste an.

$ ansible-playbook -i inventory.txt indexes.yaml

Bedingungen in Ansible-Schleifen

In Ansible-Schleifen können Sie die bedingte Anweisung when verwenden, um die Schleife basierend auf der Art von Variablen oder Systemfakten zu steuern. Betrachten Sie das Playbook unten, wo wir eine Liste von Paketen haben, die installiert werden müssen.

Wir haben ein Array namens „packages“ angegeben ‘, die eine Liste der Pakete enthält, die installiert werden müssen. Jedes der Elemente im Array enthält den Namen des zu installierenden Pakets und die Eigenschaft „required“. “, die auf „True“ gesetzt ist ‘ für 2 Pakete und ‘False ‘ für ein Paket.

$ vi install-packages.yaml
---
- name: Install software
  become: yes
  hosts: all
  vars:
    packages:
      - name: neofetch
        required: True

      - name: cpu-checker
        required: True

      - name: screenfetch
        required: False
  tasks:
    - name: Install "{{ item.name }}" on Ubuntu
      apt:
        name: "{{ item.name }}"
        state: present

      when:
        - item.required == True
        - ansible_facts['distribution'] =="Ubuntu"

      loop: "{{ packages }}"

Das „wann Die bedingte Anweisung versucht, die Softwarepakete mit der Eigenschaft „required“ zu installieren “ auf „Wahr setzen ’ auf Zielsystemen, die Ubuntu-Distributionen sind. Unten ist die Ausgabe des Playbooks, wenn es ausgeführt wird.

Die ausführliche Ausgabe zeigt deutlich die Pakete, die installiert werden, und das Paket, das basierend auf der bedingten Anweisung ignoriert wird.

Und damit sind wir am Ende dieses Themas angelangt. Wir hoffen, dass Sie ein anständiges Verständnis von Loops in Ansible-Playbooks haben. Zögern Sie nicht, uns für weitere Erläuterungen zu kontaktieren.

Auch lesen :So verwenden Sie die Jinja2-Vorlage im Ansible Playbook


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

  2. So verwenden Sie Ansible zum Einrichten der Systemüberwachung mit Prometheus

  3. So verwenden Sie die Bedingungsanweisung if else in Bash-Skript

  4. So installieren und verwenden Sie Ansible unter Debian 11

  5. So installieren Sie Softwarepakete mit einem Ansible-Playbook

So erstellen Sie Ansible-Rollen und verwenden sie im Playbook

So erstellen und verwenden Sie benutzerdefinierte Fakten in Ansible

So definieren und verwenden Sie Handler in Ansible Playbooks

So verwenden Sie die Jinja2-Vorlage in Ansible

Wie man Ansible verwendet, um Vim zu konfigurieren

So verwenden Sie Ansible zum Senden einer E-Mail mit Google Mail