Я создал простую пьесу на Ansible:
---
- hosts: all
tasks:
- name: Install Icinga2 on Windows
include_role:
name: my.icinga2.role
apply:
tags:
- install-icinga2
Роль содержит этот файл задач:
---
- include_tasks: vars.yml
tags: ['always']
- include_tasks: install.yml
tags: ['install-icinga2-stack', 'install-icinga2']
- include_tasks: ido-install.yml
when: icinga2_ido_enable == true
tags: ['install-icinga2-stack', 'install-icinga2-ido']
- include_tasks: configure.yml
tags: ['install-icinga2-stack']
[...]
Это результат, когда я выполняю playbook:
me@ansible:~/ansible$ ansible-playbook plays/icinga2-client-win.yml -i staging.ini --limit windows
PLAY [all] ***************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************
ok: [my.windows.client]
TASK [Include variables for Icinga 2] ********************************************************************************************
ok: [my.windows.client]
TASK [set_fact] ******************************************************************************************************************
skipping: [my.windows.client]
TASK [set_fact] ******************************************************************************************************************
ok: [my.windows.client]
TASK [Install Icinga2 Client and connect it to the master server] ****************************************************************
TASK [my.icinga2.role : include_tasks] ***************************************************************************************
included: /home/me/ansible/roles/internal/my.icinga2.role/tasks/vars.yml for my.windows.client
TASK [my.icinga2.role : Set default fact for mysql command] ******************************************************************
ok: [my.windows.client]
TASK [my.icinga2.role : Set fact for mysql command if auth params are given] *************************************************
skipping: [my.windows.client]
TASK [my.icinga2.role : Set Monitoring Plugins for old Debian Versions] ******************************************************
skipping: [my.windows.client]
TASK [my.icinga2.role : include_tasks] ***************************************************************************************
included: /home/me/ansible/roles/internal/my.icinga2.role/tasks/install.yml for my.windows.client
TASK [my.icinga2.role : include_tasks] ***************************************************************************************
skipping: [my.windows.client]
TASK [my.icinga2.role : include_tasks] ***************************************************************************************
skipping: [my.windows.client]
TASK [my.icinga2.role : include_tasks] ***************************************************************************************
included: /home/me/ansible/roles/internal/my.icinga2.role/tasks/install-Windows.yml for my.windows.client
TASK [my.icinga2.role : set_fact] ********************************************************************************************
ok: [my.windows.client]
TASK [my.icinga2.role : set_fact] ********************************************************************************************
skipping: [my.windows.client]
TASK [my.icinga2.role : Install Icinga 2] ************************************************************************************
changed: [my.windows.client]
TASK [my.icinga2.role : include_tasks] ***************************************************************************************
skipping: [my.windows.client]
TASK [my.icinga2.role : include_tasks] ***************************************************************************************
included: /home/me/ansible/roles/internal/my.icinga2.role/tasks/configure.yml for my.windows.client
TASK [my.icinga2.role : Check if Icinga 2 API are already activated] *********************************************************
[ This should not be included! ]
RUNNING HANDLER [my.icinga2.role : Restart Icinga2 on Windows] ***************************************************************
to retry, use: --limit @/home/me/ansible/plays/icinga2-client-win.retry
PLAY RECAP ***********************************************************************************************************************
my.windows.client : ok=10 changed=1 unreachable=0 failed=1
Почему configure.yml файл задачи роли включен, так как он должен быть включен, только если я применяю установить icinga2-stack тег и я применяю install-icinga2 один?
Далее я понимаю, что ido-install.yml файл задачи роли не включен только потому, что icinga2_ido_enable переменная не true
в этой пьесе (и по умолчанию false
), а не потому, что один из его тегов не применяется (что должно быть тем, что я хочу).
Где я не прав?
Применение тегов в include_role означает, что теги
будет применен к задачам внутри включения.
Другими словами, задачи во включенной роли унаследуют примененные теги. Ошибочно ожидать, что примененные теги будут выбирать задачи. Для выбора задач используйте --tags
и --skip-tags
в командной строке или в настройках конфигурации Ansible используйте TAGS_RUN
и TAGS_SKIP
параметры.
Один важный факт не упоминается явно в документации include_role. Параметр подать заявление теги работают, только если вся задача tags: always
. Это показано только в Примеры.
- name: Apply tags to tasks within included file
include_role:
name: install
apply:
tags:
- install
tags:
- always
пример
У нас есть role1 с двумя задачами
shell> cat roles/role1/tasks/main.yml
- debug:
msg: 'This is task 2'
tags: task2
- debug:
msg: 'This is task 3'
tags: task3
и пьеса
shell> cat play1.yml
- hosts: localhost
tasks:
- debug:
msg: 'This is task 1'
tags: task1
- include_role:
name: role1
apply:
tags: role1
tags: always
Если мы запустим playbook без каких-либо опций, все задачи будут включены
shell> ansible-playbook play1.yml | grep msg
"msg": "This is task 1"
"msg": "This is task 2"
"msg": "This is task 3"
Смотрите другие варианты ниже
shell> ansible-playbook play1.yml --tags task1 | grep msg
"msg": "This is task 1"
shell> ansible-playbook play1.yml --tags task2 | grep msg
"msg": "This is task 2"
shell> ansible-playbook play1.yml --tags role1 | grep msg
"msg": "This is task 2"
"msg": "This is task 3"
shell> ansible-playbook play1.yml --skip-tags role1 | grep msg
"msg": "This is task 1"
shell> ansible-playbook play1.yml --tags role1 --skip-tags task2 | grep msg
"msg": "This is task 3"
Заметка. Список тегов работает не так, как ожидалось.
shell> ansible-playbook play1.yml --list-tags
playbook: play1.yml
play #1 (localhost): localhost TAGS: []
TASK TAGS: [always, task1]
(Для записи: include_role с тегами apply не работает # 52063)