Рубрики
Uncategorized

Ansible: влияние на выполнение действий с условиями и филиалами

Когда вы выполняете Ansible Playbook, все действия выполняются сверху вниз, в порядке, которые они написаны. Th … Tagged с Ansible, DevOps.

Когда вы выполняете Ansible Playbook, все действия выполняются сверху вниз, в порядке, которые они написаны. Есть случаи, когда вам нужно больше контроля: вы хотите проверить хост, который установлено определенное программное обеспечение, или вы хотите проверить определенное условие и прекратить следить за действиями, когда это условие не выполнено.

В этой статье я рассмотрю следующие варианты влияния на выполнение действий: определение того, когда выполнить действие, определение того, когда остановить действие, разветвлять поток управления и управление результатами действия.

Эта статья первоначально появилась в мой блог .

Ansible Concepts

В этой статье предполагается, что вы знакомы с Ansible Concepts. Если нет, вот краткое определение:

  • Playbook: коллекция пьес
  • Играть: Последовательность действий или ролей, которые применяются к хозяину
  • Действие: конкретная команда для хоста (установка пакетов, настройка значений файлов конфигурации)
  • Роль: многоразовый набор действий

Выполнять задачи в условиях

Чтобы выразить условия, любое действие может быть дополнено ключевым словом Когда Анкет Условия написаны в Jinja2 Templating Language Анкет Общим вариантом использования является проверка распределения или архитектуры ОС Хост.

Вот пример из моего проекта инфраструктуры дома. При установке консула я проверяю, есть ли у хоста архитектура ARM (Raspberry Pi) или архитектура x86_64. Основываясь на этом, я определяю правильный путь для загрузки требуемого двоичного файла.

 - name: Set vars when architecture is armv7l
    set_fact:
      consul_src_file: "consul_{{ consul_version }}_linux_armhfv6.zip"
     ...
    when: ansible_facts.architecture == 'armv7l'

  - name: Set vars when architecture is x86_64
    set_fact:
      consul_src_file: "consul_{{ consul_version }}_linux_amd64.zip"
      ...
    when: ansible_facts.architecture == 'x86_64'

В некоторых случаях вам нужно ждать, пока условие будет правдой. Это может быть выражено с действием wait_for Анкет Например, у вас есть пьеса, которая организовала запуск некоторого программного обеспечения, и одна задача должна ждать, пока программное обеспечение не запустится. Вы можете проверить наличие файла PID -файла приложений, чтобы присутствовать на хосте — например,:

- name: wait for Nginx server to be running
  command: /usr/sbin/sync_web_content
  wait_for:
    path: /var/logs/nginx.pid
    state: present

Остановить задачи в условиях

Есть три команды, чтобы остановить игры, когда определенные условия не выполняются: проверки, утверждения и явные сбои. Думайте о них, как о контрольных списках, которые необходимо выполнить.

Валидации

Валидации — это команды, специфичные для некоторых модулей, такие как Шаблоны или LineInfile Анкет Они вызывают команду, которая получает новый файл. Если код возврата этой команды является чем -то иным, чем 0, проверка не является успешной.

В следующем примере я добавляю новую запись в /и т. Д./FSTAB и хочу предотвратить, что в файле есть ошибка. Последствия могут быть ужасными, как незагружаемая система. С Mount -f , система попытается установить все файловые системы, и я передаю новый файл с флагом -T %s Анкет

- name: Create fstab entry
  lineinfile:
    path: /etc/fstab
    line: "{{ nfs_dir_server_ip }}:{{ nfs_dir_mnt_path }}  {{ nfs_dir_mnt_path }} nfs defaults,soft,bg,noauto,rsize=32768,wsize=32768,noatime  0 0"
    regex: "{{ nfs_dir_server_ip }}:{{ nfs_dir_mnt_path }}"
    state: present
    validate: /usr/sbin/mount -fa -T %s

Утверждение

Утверждения — это действия, выраженные с утверждать . Вы определяете одно или несколько условий с это и вы можете определить пользовательский Успех_msg или fail_msg . В следующем примере я проверяю, что семейство ОС хоста является системой Debian, давая сообщение об ошибке, если это не так.

- name: Check OS family
  assert:
    that:
      - ansible_facts[inventory_hostname].ansible_os_family == 'Debian'
    fail_msg: Host is not Debian, stopping installation

Явное провальное

Наконец, вы можете явно провал Когда условие не выполнено. Вот пример из моего проекта «Инфраструктура дома»: я проверяю, если программа консула в определенной версии уже установлена, или немедленно останавливает игру.

- name:
    command: consul --version
    register: result
    failed_when: false

  - name: Check if current consul version is installed
    fail:
      msg: Consul v{{consul_version}} already installed - only updating config files
    when: result is search("Consul v{{consul_version}}")

Поток управления ветвлениями с блоками

До сих пор мы видели примеры игр, которые выполняют задачи на основе условий или прекращают выполнять любую другую задачу. Это хорошее начало, но иногда вам нужно еще больше контроля.

Блоки — это ответ. В своей основной форме блок охватывает набор задач. Вы можете прикрепить Когда пункт к блоку и, следовательно, предоставьте простую форму ветвления, аналогичную if-else в языках программирования.

Вот пример для установки и настройки текстового редактора Nano, если переменная Software_package определяется и когда это равняется нано.

- name: Install text editor
  block:
    - name: Install nano
      apt:
        name: nano
        state: present
    - name: Configure nano
      template:
        src: .nanorc.js
        dest: {{user_home}}.nanorc
        state: present
    when: software_package is defined and software_package == 'nano'
- name: Install zsh
  ...

Блоки предоставляют еще больше функций: они могут ловить ошибки и выполнять задачи в случае ошибки или в любом случае. Первое поведение достигается с помощью спасение Пункт: Когда возникает ошибка, выполняются задачи внутри этой блочной структуры. Второе поведение выражается с Всегда пункт: Эти задачи всегда выполняются, независимо от того, была ли ошибка выдвинута или нет.

Примером из моего проекта «Инфраструктура дома» является проверка того, что установлена определенная программа и программа. Если это так, действия установки, сгруппированные как Блок , не выполняются, а часть конфигурации, выраженная в Всегда Часть применяется. Я использую это для установки консула. Вот соответствующий выдержка.

- block:
  - name:
    command: consul --version
    register: result
    failed_when: false

  - name: Check if current consul version is installed
    fail:
      msg: Consul v{{consul_version}} already installed - only updating config files
    when: result is search("Consul v{{consul_version}}")

   - name: Get consul binary
     ...

  always:
    - name: Copy consul config
      template:
        src: consul.config.hcl.j2
        dest: "{{ consul_base_directory }}/consul.config.hcl"
        mode: 0644
      notify: Restart consul

Контроль результатов задачи

Любое выполненное действие будет иметь один из следующих результатов: ОК, изменено, не удалось, пропущено. Вы видите эти результаты в конце выполнения Ansible Playbook.

Измененные и неудачные результаты могут быть определены с помощью Изменен_ когда и Неудача_WHEN Пункт, состояние, которое оценивается. Я использую Неудача_WHEN Пункт при установке консула: В начале я выполняю Консул -версия Команда, действие, которое не удается, когда консул не установлен. Тем не менее, я хочу, чтобы игра продолжалась, поэтому я явно установил Неудача_WHEN условие ложно.

- block:
  - name:
    command: consul --version
    register: result
    failed_when: false

Вывод

Когда вы используете Ansible, действия выполняются линейно, сверху вниз. Эта статья показала вам, как повлиять на этот порядок. Вы можете определить явные условия при выполнении действий. Вы можете установить проверки и утверждения, которые останавливают игру, когда они не выполняются. С блоками вы можете сгруппировать несколько действий вместе с условием и реагировать на любые ошибки, которые брошены. И, наконец, вы можете определить, когда считается, что действие изменилось или не удалось. С этими вариантами вы получаете большее влияние при выполнении действий в Ansible.

Оригинал: «https://dev.to/admantium/ansible-influencing-action-execution-with-conditions-and-branches-578h»