Ansible - Erweiterte Ausführung

In diesem Kapitel erfahren Sie, was die erweiterte Ausführung mit Ansible ist.

So beschränken Sie die Ausführung nach Aufgaben

Dies ist eine sehr wichtige Ausführungsstrategie, bei der nur eine Ausführung und nicht das gesamte Spielbuch ausgeführt werden muss. For exampleAngenommen, Sie möchten nur einen Server stoppen (falls ein Produktionsproblem auftritt) und dann nach dem Anwenden eines Patches nur den Server starten.

Hier im ursprünglichen Playbook waren Stop und Start Teil verschiedener Rollen im selben Playbook, dies kann jedoch unter Verwendung von Tags behandelt werden. Wir können verschiedene Tags für verschiedene Rollen bereitstellen (die wiederum Aufgaben haben) und daher basierend auf den vom Executor bereitgestellten Tags nur die angegebene Rolle / Aufgabe ausgeführt wird. Für das obige Beispiel können wir also Tags wie das folgende hinzufügen:

- {role: start-tomcat, tags: ['install']}}

Der folgende Befehl hilft bei der Verwendung von Tags -

ansible-playbook -i hosts <your yaml> --tags "install" -vvv

Mit dem obigen Befehl wird nur die Start-Tomcat-Rolle aufgerufen. Das bereitgestellte Tag unterscheidet zwischen Groß- und Kleinschreibung. Stellen Sie sicher, dass die genaue Übereinstimmung an den Befehl übergeben wird.

So beschränken Sie die Ausführung durch Hosts

Es gibt zwei Möglichkeiten, um bestimmte Schritte auf bestimmten Hosts auszuführen. Für eine bestimmte Rolle definiert man die Hosts - für welche spezifischen Hosts diese bestimmte Rolle ausgeführt werden soll.

Beispiel

- hosts: <A> 
   environment: "{{your env}}" 
   pre_tasks: 
      - debug: msg = "Started deployment. 
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}} " 
     
   roles: 
      - {role: <your role>, tags: ['<respective tag>']} 
   post_tasks: 
      - debug: msg = "Completed deployment. 
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}}" 
 
- hosts: <B> 
   pre_tasks: 
      - debug: msg = "started.... 
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}} " 
        
   roles: 
      - {role: <your role>, tags: ['<respective tag>']} 
   post_tasks: 
      - debug: msg = "Completed the task.. 
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}}"

Gemäß dem obigen Beispiel werden abhängig von den bereitgestellten Hosts nur die jeweiligen Rollen aufgerufen. Jetzt sind meine Hosts A und B in den Hosts (Inventardatei) definiert.

Alternative Lösung

Eine andere Lösung könnte darin bestehen, die Hosts des Playbooks mithilfe einer Variablen zu definieren und dann eine bestimmte Hostadresse über zu übergeben --extra-vars - -

# file: user.yml  (playbook) 
--- 
- hosts: '{{ target }}' 
   user: ... 
playbook contd….

Ausführen des Playbooks

ansible-playbook user.yml --extra-vars "target = "<your host variable>"

Wenn {{target}} nicht definiert ist, führt das Playbook nichts aus. Bei Bedarf kann auch eine Gruppe aus der Hosts-Datei übergeben werden. Dies schadet nicht, wenn die zusätzlichen Vars nicht bereitgestellt werden.

Playbook für einen einzelnen Host

$ ansible-playbook user.yml --extra-vars "target = <your hosts variable>" --listhosts