#ansible #tags #ansible-facts
#ансибль #Теги #ansible-факты #ansible
Вопрос:
Я привык использовать, --tags
когда я использую ansible-playbook
, чтобы отфильтровать, какие задачи будут выполняться. Недавно я перешел с Ansible 2.7 на 2.9 (огромный разрыв, да?).
Я был удивлен, что ansible не собирал факты исключительно при использовании --tags
. И я видел несколько похожих случаев, закрытых в GitHub, таких как этот или этот. Похоже, это влияет на ansible начиная с версии 2.8, но отображается как разрешенный. Кто — нибудь может подтвердить такое поведение ? Кажется, это происходит с 2.8.
ВЕРСИЯ ANSIBLE :
ansible --version
ansible 2.9.9.post0
config file = None
configured module search path = [u'/opt/ansible/ansible/library']
ansible python module location = /opt/ansible/ansible/lib/ansible
executable location = /opt/ansible/ansible/bin/ansible
python version = 2.7.6 (default, Nov 13 2018, 12:45:42) [GCC 4.8.4]
КОНФИГУРАЦИЯ ANSIBLE :
ansible-config dump --only-changed
DEFAULT_MODULE_PATH(env: ANSIBLE_LIBRARY) = [u'/opt/ansible/ansible/library']
ШАГИ ДЛЯ ВОСПРОИЗВЕДЕНИЯ :
playbook test.yml :
- name: First test
hosts: localhost
connection: local
gather_facts: yes
roles:
- { role: test, tags: test }
tags: first
- name: Second test
hosts: localhost
connection: local
gather_facts: yes
roles:
- { role: test, tags: test }
tags: second
роль: роли / тест / задачи/main.yml
- debug:
msg: System {{ inventory_hostname }} has uuid {{ ansible_product_uuid }}
Результаты :
ansible-playbook test.yml --check
= Ошибок нет.
ansible-playbook test.yml --check --tags "test"
= сбой: 1
«Задача включает в себя опцию с неопределенной переменной. Ошибка заключалась в том, что ‘ansible_product_uuid’ не определен […]»
И я вижу на выходе, что факты не собраны.
Ответ №1:
Что ж, похоже, это преднамеренное поведение, когда у вас есть теги на уровне воспроизведения:
Это предполагаемое поведение. При пометке воспроизведения тегами эти теги применяются к
gather_facts
шагу и удаляетсяalways
тег, который применяется по умолчанию. Если цель состоит в том, чтобы пометить игру, вы можете добавитьsetup
задачу с тегами, чтобы собрать факты.
самдоран прокомментировал 11 июня 2019
Пожалуйста, обратите внимание, что это не связано с использованием ролей, поскольку это можно воспроизвести, просто выполнив:
- name: First test
hosts: all
tags:
- first
tasks:
- debug:
msg: System {{ inventory_hostname }} has uuid {{ ansible_product_uuid }}
tags: test
Что приводит к ошибочному повторению:
$ ANSIBLE_STDOUT_CALLBACK=debug ansible-playbook play.yml --tags "test"
PLAY [First test] *************************************************************************************************
TASK [debug] ******************************************************************************************************
fatal: [localhost]: FAILED! => {}
MSG:
The task includes an option with an undefined variable. The error was: 'ansible_product_uuid' is undefined
The error appears to be in '/ansible/play.yml': line 7, column 7, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
tasks:
- debug:
^ here
PLAY RECAP ********************************************************************************************************
localhost : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
Поэтому вам придется либо удалить тег вашего игрового уровня, либо использовать setup
модуль, как будет предложено.
Это можно сделать внутри вашей роли, чтобы ваша роль перестала полагаться на переменные, которые, возможно, не были установлены.
Учитывая роль roles/test/tasks/main.yml
- setup:
- debug:
msg: System {{ inventory_hostname }} has uuid {{ ansible_product_uuid }}
И сборник пьес:
- name: First test
hosts: all
tags:
- first
roles:
- role: test
tags:
- test
- name: Second test
hosts: all
tags:
- second
roles:
- role: test
tags:
- test
Вот бы выполнить и резюмировать это:
$ ansible-playbook play.yml --tags "test"
PLAY [First test] *************************************************************************************************
TASK [test : setup] ***********************************************************************************************
ok: [localhost]
TASK [test : debug] ***********************************************************************************************
ok: [localhost] => {
"msg": "System localhost has uuid 3fc44bc9-0000-0000-b25d-bf9e26ce0762"
}
PLAY [Second test] ************************************************************************************************
TASK [test : setup] ***********************************************************************************************
ok: [localhost]
TASK [test : debug] ***********************************************************************************************
ok: [localhost] => {
"msg": "System localhost has uuid 3fc44bc9-0000-0000-b25d-bf9e26ce0762"
}
PLAY RECAP ********************************************************************************************************
localhost : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Все это продолжается:
ansible 2.9.9
config file = None
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.8/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.8.3 (default, May 15 2020, 01:53:50) [GCC 9.3.0]
Комментарии:
1. Хорошо, ваше решение работает хорошо и теперь имеет смысл для меня. Однако мне показалось очень любопытным, что использование тегов влияет на сбор фактов. Итак, в моем случае я должен быть осторожен, чтобы не смешивать теги playbook и role, или собирать факты столько раз, сколько у меня есть ролей (используя модуль настройки). Спасибо за помощь
2. Ну, это связано с тем фактом, что к игре или задаче без явного тега фактически все еще применяется один:
always
тег. Поэтому, когда вы явно помечаете воспроизведение, как указано в комментарии сопровождающего Ansible, упомянутом в ответе, вы перезаписываете этотalways
тег, а затем должны указать воспроизведение тега, если хотите, чтобы факты о воспроизведении были собраны.