====== Ansible - Используем тэги (tags) ======
Иногда бывает полезным использование тэгов в большом ''playbook''. Тэги необходимы для того чтобы выполнить именно определённые ''tasks'' из всего ''playbook''.
Приведу несколько примеров, когда можно использовать тэги, или даже нужно:
* Допустим у вас ''playbook'' из 20 - 30 задач (tasks) и вам нужно выполнить только 2 - 3 задачи, например, просто перезапустить сервис или установить какие-то пакеты. В таком случае вы назначаете этим задачам определённый тэг и запускаете его.
* Ещё один пример это сделать один ''playbook'' в котором можно прописать задачи по управлению всеми сервисами, например, тэг для отключения сервиса ''PostgreSQL'' и тэг для его включения. Это позволит вам при необходимости управлять всеми сервисами.
==== Как использовать ====
Для использования тэгов придётся выполнить следующие 2 шага:
- Задать задаче (task) тэг
- При запуске ''playbook'' указать этот тэг
==== Задать задаче (task) тэг ====
В качестве примера я буду использовать ''playbook'' по управлению сервисами. В ''playbook'' 2 задачи по управлению сервисом ''metricbeat'', где один включает сервис и другой выключает. Для демонстрации я просто использую ''debug'', понятное дело, что нужно использовать ''service''. Обратите внимание на ''tags'', их также может быть несколько для одной задачи.
tasks.yml
- hosts: localhost
tasks:
- name: Stop metricbeat
debug:
msg: Stop metricbeat
tags:
#тут наш тэг для остановки
- stop metricbeat
- name: Start metricbeat
debug:
msg: Start metricbeat
tags:
#тут наш тэг для запуска
- start metricbeat
==== При запуске playbook указать этот тэг ====
Теперь нам осталось только запустить ''playbook'' с определённым тэгом. Для этого используем знакомую команду ''ansible-playbook'' и передаем опцию ''--tags''. Опция ''--tags'' может принимать несколько значений, например ''--tags "tag1,tag2,tag3"''.
Для остановки используем тэг ''stop metricbeat''.
werwolf@werwolf-System-Product-Name:~/$ ansible-playbook tasks.yml --tags="stop metricbeat"
TASK [Stop metricbeat] **************************************************************************************************************************
ok: [localhost] => {
"msg": "Stop metricbeat"
}
Для запуска используем тэг ''start metricbeat''.
werwolf@werwolf-System-Product-Name:~/$ ansible-playbook tasks.yml --tags="start metricbeat"
TASK [Start metricbeat] *************************************************************************************************************************
ok: [localhost] => {
"msg": "Start metricbeat"
}
==== Какие задачи запустятся? ====
Если файл слишком большой или ''playbook'' писали не вы наверняка появится желание какие именно задачи запустятся при использование определённого тэга.
ansible-playbook tasks.yml --tags="start metricbeat" --list-tasks
playbook: tasks.yml
play #1 (localhost): localhost TAGS: []
tasks:
Start metricbeat TAGS: [start metricbeat]
==== Используем роли ====
Для того чтобы задать тэг роли (role) нужно задавать тэг именно в ''playbook'' где вызываются эти роли.
Пример с использованием roles:
roles.yml
- hosts: localhost
roles:
- role: stop_metricbeat
tags:
#тут наш тэг для остановки
- stop metricbeat
- role: start_metricbeat
tags:
#тут наш тэг для запуска
- start metricbeat
werwolf@werwolf-System-Product-Name:~/$ ansible-playbook roles.yml --tags="start metricbeat"
TASK [start_metricbeat : Start metricbeat] ******************************************************************************************************
ok: [localhost] => {
"msg": "Start metricbeat"
}
TASK [start_metricbeat : Start service2] ********************************************************************************************************
ok: [localhost] => {
"msg": "Start service2"
}
Пример с использованием ''import_role'':
import_role.yml
- hosts: localhost
tasks:
- import_role:
name: stop_metricbeat
tags:
#тут наш тэг для остановки
- stop metricbeat
- import_role:
name: start_metricbeat
tags:
#тут наш тэг для запуска
- start metricbeat
==== Наследование тэгов ====
В **Ansible** по умолчанию тэги не распространяются на вложенные задачи, т.е. когда мы запускаем задачу в ''playbook'' с определённым тэгом то задача эта запускается только потому что задан тэг для самой задачи, а не для роли, например.
Если вам вдруг нужно добавить наследование тэга для можно воспользоваться ''include_tasks'' или ''include_role'' добавляя **apply**.
include_task.yaml
- hosts: localhost
tasks:
- include_tasks:
file: roles/start_metricbeat/tasks/main.yml
apply:
tags: start metricbeat
tags:
#тут наш тэг для остановки
- start metricbeat
- include_tasks:
file: roles/stop_metricbeat/tasks/main.yml
apply:
tags: stop metricbeat
tags:
#тут наш тэг для запуска
- stop metricbeat
werwolf@werwolf-System-Product-Name:~/$ ansible-playbook include_tasks.yml --tags="stop metricbeat"
TASK [include_tasks] ****************************************************************************************************************************
included: /home/admin/ansible-examples/tags/roles/stop_metricbeat/tasks/main.yml for localhost
TASK [Stop metricbeat] **************************************************************************************************************************
ok: [localhost] => {
"msg": "Stop metricbeat"
}
TASK [Stop service2] ****************************************************************************************************************************
ok: [localhost] => {
"msg": "Stop service2"
}
Мы видим, что в итоге у нас остановились оба сервиса хотя, как и в случае с **Используем роли**, но тут немного другой расклад. Тут выполнились обе задачи в роли потому что мы добавили ко всем задачам в роле ''stop_metricbeat'' тэг ''stop metricbeat'', используя **apply**.
Для примера запустим то же самое, но только уже без **apply**, где выполниться только одна задача из роли ''stop_metricbeat''.
include_tasks_without_apply.yml
- hosts: localhost
tasks:
- include_tasks:
file: roles/start_metricbeat/tasks/main.yml
tags:
#тут наш тэг для остановки
- start metricbeat
- include_tasks:
file: roles/stop_metricbeat/tasks/main.yml
tags:
#тут наш тэг для запуска
- stop metricbeat
werwolf@werwolf-System-Product-Name:~/$ ansible-playbook include_tasks_without_apply.yml --tags="stop metricbeat"
TASK [include_tasks] ****************************************************************************************************************************
included: /home/admin/ansible-examples/tags/roles/stop_metricbeat/tasks/main.yml for localhost
TASK [Stop metricbeat] **************************************************************************************************************************
ok: [localhost] => {
"msg": "Stop metricbeat"
}
==== Зарезервированные тэги ====
**Ansible** предоставляет 2 зарезервированных тэга:
* **always** - задачи с этим тэгом будут выполнятся всегда, в независимости от того какой тэг вы указали при запуске. Убрать это поведение можно используя опцию ''--skip-tags always''.
* **never** - не трудно догадаться что тут обратная история задачи с этим тэгом не будут выполняться только если вы не укажете конкретно ''--tags never''.
always.yml
- hosts: localhost
tasks:
- name: Stop metricbeat
debug:
msg: Stop metricbeat
tags: [stop metricbeat,always]
#тут наш тэг для остановки
- name: Start metricbeat
debug:
msg: Start metricbeat
tags:
#тут наш тэг для запуска
- start metricbeat
werwolf@werwolf-System-Product-Name:~/$ ansible-playbook always.yml --tags="start metricbeat"
TASK [Stop metricbeat] **************************************************************************************************************************
ok: [localhost] => {
"msg": "Stop metricbeat"
}
TASK [Start metricbeat] *************************************************************************************************************************
ok: [localhost] => {
"msg": "Start metricbeat"
}
never.yml
- hosts: localhost
tasks:
- name: Stop metricbeat
debug:
msg: Stop metricbeat
tags: [never]
#тут наш тэг для остановки
- name: Start metricbeat
debug:
msg: Start metricbeat
tags:
#тут наш тэг для запуска
- start metricbeat
werwolf@werwolf-System-Product-Name:~/$ ansible-playbook never.yml
TASK [Start metricbeat] *************************************************************************************************************************
ok: [localhost] => {
"msg": "Start metricbeat"
}