ansible
Несоблюдение: петли и условные обозначения
Поиск…
замечания
Официальные документы объясняют условные обозначения.
Нескончаемый (github)
Какие условные обозначения использовать?
Использование условных выражений через (синтаксис находится в [brackets]
):
когда [ когда: ]
Task: - name: run if operating system is debian command: echo "I am a Debian Computer" when: ansible_os_family == "Debian"
петли [ with_items: ]
циклы [ with_dicts: ]
Пользовательские факты [ когда: my_custom_facts == '1234']
Условный импорт
Выбор файлов и шаблонов на основе переменных
[Когда] Условие: `ansible_os_family` Списки
Общего пользования
- когда: ansible_os_family == "CentOS"
- когда: ansible_os_family == "Редхат"
- когда: ansible_os_family == "Дарвин"
- когда: ansible_os_family == "Debian"
- когда: ansible_os_family == "Windows"
Все списки
на основе обсуждения здесь 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'
)
Когда условие
Основное использование
Используйте условие when, чтобы контролировать, выполняется или не выполняется задача или роль. Обычно это используется для изменения игрового поведения на основе фактов из системы назначения. Рассмотрим этот учебник:
- hosts: all
tasks:
- include: Ubuntu.yml
when: ansible_os_family == "Ubuntu"
- include: RHEL.yml
when: ansible_os_family == "RedHat"
Где Ubuntu.yml
и RHEL.yml
включают некоторую логику, специфичную для дистрибутива.
Другим распространенным применением является ограничение результатов для тех, кто находится в определенных группах инвентаризации Ansible. Рассмотрим этот файл инвентаризации:
[dbs]
mydb01
[webservers]
myweb01
И этот плейбук:
- hosts: all
tasks:
- name: Restart Apache on webservers
become: yes
service:
name: apache2
state: restarted
when: webservers in group_names
Это использует магическую переменную group_names
.
Условный синтаксис и логика
Единственное условие
Синтаксис
when: (condition)
пример
-
when: ansible_os_family == "Debian"
-
when: ansible_pkg_mgr == "apt"
-
when: myvariablename is defined
Булевский фильтр
пример
when: result|failed
Несколько условий
Синтаксис
When: condition1 and/or condition2
Пример (простой)
when: ansible_os_family == "Debian" and ansible_pkg_mgr == "apt"
Пример (сложный)
Для обеспечения четкости или для управления приоритетом используйте круглые скобки. «И» имеет более высокий приоритет, чем «ИЛИ».
Классы могут охватывать линии:
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', '>=')
Обратите внимание на использование круглых скобок для группировки «или» в первой проверке распределения.
Получите `ansible_os_family` и` ansible_pkg_mgr` с настройкой
Мы можем получить факты ( ansible_os_family
, ansible_pkg_mgr
) с командой Ad-Hoc модуля настройки и фильтра.
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 }
Простые «Когда» Пример (ы)
Дано:
---
variable_name: True
Затем эти задачи всегда выполняются.
- 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
Эта задача никогда не будет выполняться.
- name: This is a conditional task
module: src=/example/ dest=/example
when: False
Использование до повторной проверки цикла
Это пример использования до / retries / delay для реализации живой проверки для запуска webapp. Он предполагает, что будет некоторый период времени (до 3 минут), когда webapp отказывается от соединений сокетов. После этого он проверяет / живую страницу для слова «ОК». Он также делегирует поиск URL-адреса для запуска localhost. Это имеет смысл в качестве конечной задачи в учебнике для развертывания.
---
- 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
Пока шаблон повторения не может использоваться с любым действием; Несвязанная документация обеспечивает пример ожидания, пока некоторая команда оболочки не вернет желаемый результат: http://docs.ansible.com/ansible/playbooks_loops.html#do-until-loops .