Оглавление:
Карта сайта:
Оглавление:
Карта сайта:
Иногда бывает полезным использование тэгов в большом playbook. Тэги необходимы для того чтобы выполнить именно определённые tasks из всего playbook.
Приведу несколько примеров, когда можно использовать тэги, или даже нужно:
playbook из 20 - 30 задач (tasks) и вам нужно выполнить только 2 - 3 задачи, например, просто перезапустить сервис или установить какие-то пакеты. В таком случае вы назначаете этим задачам определённый тэг и запускаете его.playbook в котором можно прописать задачи по управлению всеми сервисами, например, тэг для отключения сервиса PostgreSQL и тэг для его включения. Это позволит вам при необходимости управлять всеми сервисами.Для использования тэгов придётся выполнить следующие 2 шага:
playbook указать этот тэг
В качестве примера я буду использовать 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 с определённым тэгом. Для этого используем знакомую команду 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 зарезервированных тэга:
–skip-tags always.–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"
}