ansible
Ansible: Loops and Conditionals
Zoeken…
Opmerkingen
Officiële documenten geven uitleg over playbook-voorwaarden.
Ansible (github)
Welke soorten voorwaardelijk gebruik?
Gebruik Conditionals via (syntaxis staat tussen [brackets]
):
wanneer [ wanneer: ]
Task: - name: run if operating system is debian command: echo "I am a Debian Computer" when: ansible_os_family == "Debian"
lussen [ met_items: ]
lussen [ met_dicten: ]
Aangepaste feiten [ wanneer: my_custom_facts == '1234']
Voorwaardelijke invoer
Selecteer bestanden en sjablonen op basis van variabelen
[When] Staat: `ansible_os_family` Lijsten
Normaal gebruik
- wanneer: ansible_os_family == "CentOS"
- wanneer: ansible_os_family == "Redhat"
- wanneer: ansible_os_family == "Darwin"
- wanneer: ansible_os_family == "Debian"
- wanneer: ansible_os_family == "Windows"
Alle lijsten
gebaseerd op hier bespreken 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'
)
Wanneer staat
Basisgebruik
Gebruik de voorwaarde wanneer om te bepalen of een taak of rol wordt uitgevoerd of wordt overgeslagen. Dit wordt normaal gesproken gebruikt om het speelgedrag te veranderen op basis van feiten uit het doelsysteem. Overweeg dit speelboek:
- hosts: all
tasks:
- include: Ubuntu.yml
when: ansible_os_family == "Ubuntu"
- include: RHEL.yml
when: ansible_os_family == "RedHat"
Waar Ubuntu.yml
en RHEL.yml
enige distributiespecifieke logica bevatten.
Een ander veelgebruikt gebruik is om de resultaten te beperken tot die in bepaalde Ansible-inventarisgroepen. Beschouw dit inventarisbestand:
[dbs]
mydb01
[webservers]
myweb01
En dit speelboek:
- hosts: all
tasks:
- name: Restart Apache on webservers
become: yes
service:
name: apache2
state: restarted
when: webservers in group_names
Dit gebruikt de magische variabele group_names
.
Voorwaardelijke syntaxis en logica
Enkele voorwaarde
Syntaxis
when: (condition)
Voorbeeld
-
when: ansible_os_family == "Debian"
-
when: ansible_pkg_mgr == "apt"
-
when: myvariablename is defined
Booleaanse filter
Voorbeeld
when: result|failed
Meerdere voorwaarden
Syntaxis
When: condition1 and/or condition2
Voorbeeld (eenvoudig)
when: ansible_os_family == "Debian" and ansible_pkg_mgr == "apt"
Voorbeeld (complex)
Gebruik haakjes voor de duidelijkheid of om de prioriteit te regelen. "EN" heeft een hogere prioriteit dan "OF".
Clausules kunnen lijnen omspannen:
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', '>=')
Let op het gebruik van haakjes om de "of" te groeperen in de eerste distributiecontrole.
Download `ansible_os_family` en` ansible_pkg_mgr` met setup
We kunnen feiten krijgen ( ansible_os_family
, ansible_pkg_mgr
) met Ad-Hoc commando van setup-module en filter.
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 }
Eenvoudige "Wanneer" Voorbeeld (en)
Gegeven:
---
variable_name: True
Vervolgens worden deze taken altijd uitgevoerd.
- 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
Deze taak zal nooit worden uitgevoerd.
- name: This is a conditional task
module: src=/example/ dest=/example
when: False
Gebruik tot voor een nieuwe poging om levend te herhalen
Dit is een voorbeeld van het gebruik van tot / retries / delay om een actieve controle te implementeren voor een webapp die wordt gestart. Er wordt aangenomen dat er enige tijd (maximaal 3 minuten) zal zijn waarin de webapp socketverbindingen weigert. Daarna wordt de / levend pagina gecontroleerd op het woord "OK". Het delegeert ook het ophalen van de URL naar de actieve host. Dit is logisch als de laatste taak in een playbook voor implementatie.
---
- 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
Het patroon voor het opnieuw proberen kan met elke actie worden gebruikt; Ansible-documentatie biedt een voorbeeld van wachten totdat een bepaalde shell-opdracht een gewenst resultaat oplevert : http://docs.ansible.com/ansible/playbooks_loops.html#do-until-loops .