Ansible 不收集标签上的事实
Ansible not gathering facts on tags
我习惯用--tags
,而我在用ansible-playbook
过滤要执行的任务。
我最近从 Ansible 2.7 切换到 2.9(差距很大,嗯?)。
我很惊讶 ansible 在我使用 --tags
时没有专门收集事实。我看到 GitHub 中有多个类似的案件已结案,例如 this one or this 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-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
角色:roles/test/tasks/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
"The task includes an option with an undefined variable. The error was: 'ansible_product_uuid' is undefined [...]"
而且我可以在输出中看到没有收集到事实。
好吧,当你在游戏关卡上有标签时,这似乎是一种有目的的行为:
This is intended behavior. Tagging a play with tags applies those tags to the gather_facts
step and removes the always
tag which is applied by default. If the goal is to tag the play, you can add a setup
task with tags in order to gather facts.
samdoran commented 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]
我习惯用--tags
,而我在用ansible-playbook
过滤要执行的任务。
我最近从 Ansible 2.7 切换到 2.9(差距很大,嗯?)。
我很惊讶 ansible 在我使用 --tags
时没有专门收集事实。我看到 GitHub 中有多个类似的案件已结案,例如 this one or this 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-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
角色:roles/test/tasks/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
"The task includes an option with an undefined variable. The error was: 'ansible_product_uuid' is undefined [...]"
而且我可以在输出中看到没有收集到事实。
好吧,当你在游戏关卡上有标签时,这似乎是一种有目的的行为:
This is intended behavior. Tagging a play with tags applies those tags to the
gather_facts
step and removes thealways
tag which is applied by default. If the goal is to tag the play, you can add asetup
task with tags in order to gather facts.
samdoran commented 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]