Ansible 未收集标签上的事实

问题描述 投票:0回答:2

当我使用

--tags
来过滤要执行的任务时,我习惯使用
ansible-playbook
。 我最近从 Ansible 2.7 切换到 2.9(差距很大,嗯?)。

令我惊讶的是,当我使用

--tags
时,ansible 并没有专门收集事实。我在 GitHub 上看到了多个类似的案例,例如“这个”或“这个”。它似乎从 2.8 版本开始影响 ansible,但显示为已解决。有人可以证实这种行为吗?好像是从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']

重现步骤

剧本测试.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’未定义 [...]”

我可以在输出中看到事实没有被收集。

嗯,当你在游戏关卡上有标签时,这似乎是一种有目的的行为:

ansible tags ansible-facts
2个回答
4
投票
这是预期的行为。使用标签标记播放会将这些标签应用于

gather_facts

步骤并删除默认应用的
always

标签。如果目标是为该剧添加标签,您可以添加带有标签的

setup
任务以收集事实。

samdoran

于2019年6月11日发表评论 请注意

,这与角色的使用无关,因为它可以通过简单地执行以下操作来重现:

- 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]

always

0
投票


© www.soinside.com 2019 - 2024. All rights reserved.