ansible
Ansible: Pętle i warunki warunkowe
Szukaj…
Uwagi
Oficjalne dokumenty wyjaśniają warunki warunkowe.
Ansible (github)
Jakiego rodzaju warunków należy użyć?
Użyj warunkowej przez (składnia jest w [brackets]
):
kiedy [ kiedy: ]
Task: - name: run if operating system is debian command: echo "I am a Debian Computer" when: ansible_os_family == "Debian"
pętle [ with_items: ]
pętle [ with_dicts: ]
Niestandardowe fakty [ kiedy: my_custom_facts == '1234']
Przywóz warunkowy
Wybierz pliki i szablony na podstawie zmiennych
[Kiedy] Warunek: Listy `ansible_os_family`
Wspólne zastosowanie
- kiedy: ansible_os_family == "CentOS"
- kiedy: ansible_os_family == "Redhat"
- kiedy: ansible_os_family == "Darwin"
- kiedy: ansible_os_family == "Debian"
- kiedy: ansible_os_family == "Windows"
Wszystkie listy
na podstawie omówienia tutaj 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'
)
Kiedy warunek
Podstawowe użycie
Użyj warunku when, aby kontrolować, czy zadanie lub rola ma być uruchamiana czy pomijana. Zwykle służy to do zmiany zachowania gry na podstawie faktów z systemu docelowego. Rozważ ten poradnik:
- hosts: all
tasks:
- include: Ubuntu.yml
when: ansible_os_family == "Ubuntu"
- include: RHEL.yml
when: ansible_os_family == "RedHat"
Gdzie Ubuntu.yml
i RHEL.yml
zawierają logikę specyficzną dla dystrybucji.
Innym powszechnym zastosowaniem jest ograniczenie wyników do tych w niektórych grupach reklam Ansible. Rozważ ten plik ekwipunku:
[dbs]
mydb01
[webservers]
myweb01
A ten poradnik:
- hosts: all
tasks:
- name: Restart Apache on webservers
become: yes
service:
name: apache2
state: restarted
when: webservers in group_names
To używa magicznej zmiennej group_names
.
Składnia warunkowa i logika
Pojedynczy warunek
Składnia
when: (condition)
Przykład
-
when: ansible_os_family == "Debian"
-
when: ansible_pkg_mgr == "apt"
-
when: myvariablename is defined
Filtr boolowski
Przykład
when: result|failed
Wiele warunków
Składnia
When: condition1 and/or condition2
Przykład (prosty)
when: ansible_os_family == "Debian" and ansible_pkg_mgr == "apt"
Przykład (złożony)
Użyj nawiasów, aby uzyskać jasność lub kontrolować pierwszeństwo. „AND” ma wyższy priorytet niż „OR”.
Klauzule mogą obejmować linie:
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', '>=')
Zwróć uwagę na użycie nawiasów do grupowania „lub” w pierwszej kontroli dystrybucji.
Pobierz `ansible_os_family` i` ansible_pkg_mgr` z instalatorem
Możemy uzyskać fakty ( ansible_os_family
, ansible_pkg_mgr
) za pomocą polecenia Ad-Hoc modułu instalacyjnego i filtra.
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 }
Prosty przykład „kiedy”
Dany:
---
variable_name: True
Następnie te zadania zawsze uruchamiają się.
- 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
To zadanie nigdy się nie uruchomi.
- name: This is a conditional task
module: src=/example/ dest=/example
when: False
Używanie do ponownej próby zapętlenia żywej kontroli
Jest to przykład użycia polecenia till / reties / delay do wdrożenia kontroli aktywności aplikacji sieci web, która się uruchamia. Zakłada się, że przez pewien czas (do 3 minut) aplikacja internetowa odmówi połączenia przez gniazdo. Następnie sprawdza stronę / alive pod kątem słowa „OK”. Deleguje również pobieranie adresu URL do hosta lokalnego z uruchomionym programem ansible. Ma to sens jako ostatnie zadanie w podręczniku wdrażania.
---
- 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
Wzór do ponownej próby może być użyty z dowolną akcją; Dokumentacja Ansible stanowi przykład oczekiwania, aż określone polecenie powłoki zwróci pożądany wynik: http://docs.ansible.com/ansible/playbooks_loops.html#do-until-loops .