ansible
Svar: Loops and Conditionals
Sök…
Anmärkningar
Officiella dokument förklarar villkoren för spellistor.
Ansvarsfull (github)
Vilka typer av konditioner ska du använda?
Använd Conditionals via (syntax finns i [brackets]
):
när [ när: ]
Task: - name: run if operating system is debian command: echo "I am a Debian Computer" when: ansible_os_family == "Debian"
loops [ with_items: ]
loops [ with_dicts: ]
Anpassade fakta [ när: my_custom_facts == '1234']
Villkorad import
Välj filer och mallar baserat på variabler
[När] Tillstånd: `ansible_os_family`-listor
Allmänt bruk
- när: ansible_os_family == "CentOS"
- när: ansible_os_family == "Redhat"
- när: ansible_os_family == "Darwin"
- när: ansible_os_family == "Debian"
- när: ansible_os_family == "Windows"
Alla listor
baserat på diskutera här 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'
)
När skick
Grundläggande användning
Använd när villkoret för att kontrollera om en uppgift eller roll körs eller hoppas över. Detta används normalt för att ändra spelbeteende baserat på fakta från destinationssystemet. Tänk på denna spellista:
- hosts: all
tasks:
- include: Ubuntu.yml
when: ansible_os_family == "Ubuntu"
- include: RHEL.yml
when: ansible_os_family == "RedHat"
Där Ubuntu.yml
och RHEL.yml
inkluderar en viss distributionsspecifik logik.
En annan vanlig användning är att begränsa resultaten till resultaten i vissa Ansible-lagergrupper. Tänk på denna inventeringsfil:
[dbs]
mydb01
[webservers]
myweb01
Och denna spellista:
- hosts: all
tasks:
- name: Restart Apache on webservers
become: yes
service:
name: apache2
state: restarted
when: webservers in group_names
Detta använder den magiska variabeln group_names
.
Villkorad syntax och logik
Enkelt skick
Syntax
when: (condition)
Exempel
-
when: ansible_os_family == "Debian"
-
when: ansible_pkg_mgr == "apt"
-
when: myvariablename is defined
Booleskt filter
Exempel
when: result|failed
Flera villkor
Syntax
When: condition1 and/or condition2
Exempel (enkelt)
when: ansible_os_family == "Debian" and ansible_pkg_mgr == "apt"
Exempel (komplex)
Använd parenteser för tydlighet eller för att kontrollera prioritet. "OCH" har högre prioritet än "ELLER".
Klausulerna kan sträcka sig över rader:
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', '>=')
Notera användningen av parenteser för att gruppera "eller" i den första distributionskontrollen.
Skaffa `ansible_os_family` och` ansible_pkg_mgr` med installationen
Vi kan få fakta ( ansible_os_family
, ansible_pkg_mgr
) med Ad-Hoc-kommando för installationsmodul och 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 }
Enkelt "När" Exempel (er)
Given:
---
variable_name: True
Sedan körs dessa uppgifter med alltid.
- 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
Denna uppgift kommer aldrig att köras.
- name: This is a conditional task
module: src=/example/ dest=/example
when: False
Använd tills för att försöka återuppringande levande kontroll
Detta är ett exempel på att använda tills / försöker / fördröja för att implementera en levande kontroll för en webbapp som startar. Det antar att det kommer att finnas en viss tidsperiod (upp till 3 minuter) där webapp avvisar socketanslutningar. Därefter kontrollerar den på / levande sidan efter ordet "OK". Det delegerar också hämtningen av URL: en till den ansvarigaste localhost. Detta är meningsfullt som den sista uppgiften i en distributionsspelbok.
---
- 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
Mönstret tills försök kan användas igen med alla åtgärder; Svarande dokumentation ger ett exempel på att vänta tills ett visst skalkommando returnerar ett önskat resultat: http://docs.ansible.com/ansible/playbooks_loops.html#do-until-loops .