Ansible - расширенное выполнение
В этой главе мы узнаем, что такое расширенное выполнение с помощью Ansible.
Как ограничить выполнение задачами
Это очень важная стратегия выполнения, при которой нужно выполнять только одно выполнение, а не всю книгу воспроизведения. For example, предположим, вы хотите только остановить сервер (в случае возникновения производственной проблемы), а затем опубликовать патч, который вы хотите только запустить.
Здесь, в исходной пьесе, остановка и запуск были частью разных ролей в одной и той же пьесе, но с этим можно справиться с помощью тегов. Мы можем предоставить разные теги для разных ролей (которые, в свою очередь, будут иметь задачи), и, следовательно, на основе тегов, предоставленных исполнителем, выполняется только указанная роль / задача. Итак, для приведенного выше примера мы можем добавить следующие теги:
- {role: start-tomcat, tags: ['install']}}
Следующая команда помогает в использовании тегов -
ansible-playbook -i hosts <your yaml> --tags "install" -vvv
С помощью приведенной выше команды будет вызываться только роль start-tomcat. Предоставляемый тег чувствителен к регистру. Убедитесь, что команде передается точное совпадение.
Как ограничить выполнение хостами
Есть два способа добиться выполнения определенных шагов на определенных хостах. Для конкретной роли определяются хосты - на каких именно хостах должна выполняться эта конкретная роль.
пример
- hosts: <A>
environment: "{{your env}}"
pre_tasks:
- debug: msg = "Started deployment.
Current time is {{ansible_date_time.date}} {{ansible_date_time.time}} "
roles:
- {role: <your role>, tags: ['<respective tag>']}
post_tasks:
- debug: msg = "Completed deployment.
Current time is {{ansible_date_time.date}} {{ansible_date_time.time}}"
- hosts: <B>
pre_tasks:
- debug: msg = "started....
Current time is {{ansible_date_time.date}} {{ansible_date_time.time}} "
roles:
- {role: <your role>, tags: ['<respective tag>']}
post_tasks:
- debug: msg = "Completed the task..
Current time is {{ansible_date_time.date}} {{ansible_date_time.time}}"
Согласно приведенному выше примеру, в зависимости от предоставленных хостов, будут вызываться только соответствующие роли. Теперь мои хосты A и B определены в хостах (файл инвентаризации).
Альтернативное решение
Другим решением может быть определение хостов playbook с помощью переменной, а затем передача определенного адреса хоста через --extra-vars -
# file: user.yml (playbook)
---
- hosts: '{{ target }}'
user: ...
playbook contd….
Запуск Playbook
ansible-playbook user.yml --extra-vars "target = "<your host variable>"
Если {{target}} не определен, playbook ничего не делает. При необходимости также можно передать группу из файла hosts. Это не повредит, если не предусмотрены дополнительные переменные.
Пособие для одного хоста
$ ansible-playbook user.yml --extra-vars "target = <your hosts variable>" --listhosts