Поиск…


замечания

Официальные документы объясняют условные обозначения.

Нескончаемый (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 .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow