Когда вы выполняете 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»