ansible
Ansible: Loops und Bedingungen
Suche…
Bemerkungen
Offizielle Dokumente erklären die Bedingungen für das Playbook.
Ansible (Github)
Welche Arten von Bedingungen sollten verwendet werden?
Verwenden Sie Conditionals via (Syntax steht in [brackets]
):
wann [ wann: ]
Task: - name: run if operating system is debian command: echo "I am a Debian Computer" when: ansible_os_family == "Debian"
Schleifen [ with_items: ]
Schleifen [ with_dicts: ]
Benutzerdefinierte Fakten [ when: my_custom_facts == '1234']
Bedingte Einfuhren
Wählen Sie Dateien und Vorlagen basierend auf Variablen aus
[When] Bedingung: `ansible_os_family` Listen
Allgemeiner Gebrauch
- wann: ansible_os_family == "CentOS"
- wann: ansible_os_family == "Redhat"
- wann: ansible_os_family == "Darwin"
- wann: ansible_os_family == "Debian"
- wann: ansible_os_family == "Windows"
Alle Listen
basierend auf hier diskutieren http://comments.gmane.org/gmane.comp.sysutils.ansible/4685
OS_FAMILY = dict(
RedHat = 'RedHat',
Fedora = 'RedHat',
CentOS = 'RedHat',
Scientific = 'RedHat',
SLC = 'RedHat',
Ascendos = 'RedHat',
CloudLinux = 'RedHat',
PSBM = 'RedHat',
OracleLinux = 'RedHat',
OVS = 'RedHat',
OEL = 'RedHat',
Amazon = 'RedHat',
XenServer = 'RedHat',
Ubuntu = 'Debian',
Debian = 'Debian',
SLES = 'Suse',
SLED = 'Suse',
OpenSuSE = 'Suse',
SuSE = 'Suse',
Gentoo = 'Gentoo',
Archlinux = 'Archlinux',
Mandriva = 'Mandrake',
Mandrake = 'Mandrake',
Solaris = 'Solaris',
Nexenta = 'Solaris',
OmniOS = 'Solaris',
OpenIndiana = 'Solaris',
SmartOS = 'Solaris',
AIX = 'AIX',
Alpine = 'Alpine',
MacOSX = 'Darwin',
FreeBSD = 'FreeBSD',
HPUX = 'HP-UX'
)
Wenn Bedingung
Grundlegende Verwendung
Mit der when-Bedingung können Sie steuern, ob eine Aufgabe oder Rolle ausgeführt wird oder übersprungen wird. Dies wird normalerweise verwendet, um das Spielverhalten basierend auf Fakten des Zielsystems zu ändern. Betrachten Sie dieses Spielbuch:
- hosts: all
tasks:
- include: Ubuntu.yml
when: ansible_os_family == "Ubuntu"
- include: RHEL.yml
when: ansible_os_family == "RedHat"
Wo Ubuntu.yml
und RHEL.yml
eine verteilungsspezifische Logik enthalten.
Eine weitere häufige Verwendung ist das Begrenzen der Ergebnisse auf bestimmte Ansible-Bestandsgruppen. Betrachten Sie diese Bestandsdatei:
[dbs]
mydb01
[webservers]
myweb01
Und dieses Spielbuch:
- hosts: all
tasks:
- name: Restart Apache on webservers
become: yes
service:
name: apache2
state: restarted
when: webservers in group_names
Hier wird die magische Variable group_names
.
Bedingte Syntax und Logik
Einzelbedingung
Syntax
when: (condition)
Beispiel
-
when: ansible_os_family == "Debian"
-
when: ansible_pkg_mgr == "apt"
-
when: myvariablename is defined
Boolescher Filter
Beispiel
when: result|failed
Mehrere Bedingungen
Syntax
When: condition1 and/or condition2
Beispiel (einfach)
when: ansible_os_family == "Debian" and ansible_pkg_mgr == "apt"
Beispiel (komplex)
Verwenden Sie zur Klarheit oder zur Kontrolle der Rangfolge Klammern. "UND" hat eine höhere Priorität als "ODER".
Klauseln können Zeilen umfassen:
when:
ansible_distribution in ['RedHat', 'CentOS', 'ScientificLinux'] and
(ansible_distribution_version|version_compare('7', '<') or
ansible_distribution_version|version_compare('8', '>='))
or
ansible_distribution == 'Fedora'
or
ansible_distribution == 'Ubuntu' and
ansible_distribution_version|version_compare('15.04', '>=')
Beachten Sie die Verwendung von Klammern, um das "oder" bei der ersten Verteilungsprüfung zu gruppieren.
Holen Sie sich `ansible_os_family` und` ansible_pkg_mgr` mit dem Setup
Wir können Fakten ( ansible_os_family
, ansible_pkg_mgr
) mit dem Ad-Hoc-Befehl des Setup-Moduls und des Filters erhalten.
ansible_os_family:
$ ansible all -m setup -a 'filter=ansible_os_family' ra.local | SUCCESS => { "ansible_facts": { "ansible_os_family": "Debian" }, "changed": false }
ansible_pkg_mgr:
$ ansible all -m setup -a 'filter=ansible_pkg_mgr' debian.local | SUCCESS => { "ansible_facts": { "ansible_pkg_mgr": "apt" }, "changed": false }
Einfache "Wann" -Beispiele
Gegeben:
---
variable_name: True
Dann laufen diese Aufgaben immer mit.
- name: This is a conditional task
module: src=/example/ dest=/example
when: variable_name
- name: This is a conditional task
module: src=/example/ dest=/example
when: True
Diese Aufgabe wird niemals ausgeführt.
- name: This is a conditional task
module: src=/example/ dest=/example
when: False
Verwenden Sie bis, um eine erneute Wiederholung des Live-Checks zu versuchen
Dies ist ein Beispiel für die Verwendung einer Option / retries / delay, um eine Live-Überprüfung für eine startende Webanwendung zu implementieren. Es wird davon ausgegangen, dass es einige Zeit (bis zu 3 Minuten) gibt, in der die Webapp Socket-Verbindungen ablehnt. Danach wird die / Alive-Seite nach dem Wort "OK" durchsucht. Es delegiert auch den Abruf der URL an den localhost, der ausgeführt wird. Dies ist als letzte Aufgabe in einem Bereitstellungsspielbuch sinnvoll.
---
- hosts: my-hosts
tasks:
- action: uri url=http://{{ ansible_all_ipv4_addresses }}:8080/alive return_content=yes
delegate_to: localhost
register: result
until: "'failed' not in result and result.content.find('OK') != -1"
retries: 18
delay: 10
Das Muster für das Wiederholungsversuch kann mit jeder Aktion verwendet werden. Die Ansible-Dokumentation enthält ein Beispiel für das Warten, bis ein bestimmter Shell-Befehl ein gewünschtes Ergebnis zurückgibt: http://docs.ansible.com/ansible/playbooks_loops.html#do-until-loops .