【问题标题】:Ansible not gathering facts on tagsAnsible 没有在标签上收集事实
【发布时间】:2020-09-04 10:59:39
【问题描述】:

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

当我使用 --tags 时,我很惊讶 ansible 没有专门收集事实。我在 GitHub 中看到了多个类似的案例,例如 this onethis one。它似乎从 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']

复制步骤

剧本 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' is undefined [...]”

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

【问题讨论】:

    标签: ansible tags ansible-facts


    【解决方案1】:

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

    这是预期的行为。使用标签标记游戏会将这些标签应用于gather_facts 步骤并删除默认应用的always 标签。如果目标是为剧本添加标签,您可以添加带有标签的setup 任务以收集事实。

    samdoran评论了on 11 Jun 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]
    

    【讨论】:

    • 好的,您的解决方案效果很好,现在对我来说很有意义。但是,我非常好奇标签的使用会影响事实的收集。所以,就我而言,我必须小心不要混合剧本和角色标签,或者收集事实的次数与我拥有的角色一样多(使用设置模块)。感谢您的帮助
    • 这与没有明确标签的游戏​​或任务实际上仍然应用了一个事实有关:always 标签。因此,当您明确标记戏剧时,如答案中提到的 Ansible 维护者的评论所提示的那样,您会覆盖此 always 标签,然后如果您希望收集该戏剧的事实,则必须指定该标签的戏剧。
    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 2014-09-25
    • 2017-01-03
    • 2015-09-12
    • 1970-01-01
    • 2023-04-02
    • 2018-01-16
    • 1970-01-01
    相关资源
    最近更新 更多