Ansible не собирает факты по тегам

#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 тег, а затем должны указать воспроизведение тега, если хотите, чтобы факты о воспроизведении были собраны.