在使用 ansible 时,我在使用 when 条件时遇到了一些麻烦。有五个具有不同主机的主机组。不知何故 ansible 忽略了条件,尽管它不在条件下,但仍然尝试运行任务。见示例:
库存.yml
[devices]
dev1 ansible_host=10.0.0.1
[router]
router ansible_host=10.1.1.8
[hostsA]
hostA1 ansible_host=10.1.1.9
[hosts]
host1 ansible_host=10.2.1.9
host2 ansible_host=10.1.1.7
[groupB]
hostB1 ansible_host=10.1.1.5
install_packages.yml
-name: Install packages for devices and router
pip:
req: ~/requirements.txt
when: "'devices' and 'router' in group_names"
-name: Install packages for host2
pip:
req: ~/requirements.txt
when: "'host2' in group_names"
如果我执行 ansible-playbook rollout.yaml -i inv.yml --limit="host2"
它仍然尝试执行第一个任务而不是跳过它(按预期)。有谁知道为什么以及我能做什么?
答案 0 :(得分:0)
修正条件
when:
- "'devices' in group_names"
- "'router' in group_names"
这是一样的
when: "'devices' in group_names and 'router' in group_names"
如果你想测试更多的组,创建一个列表会更有效,例如my_groups
。查找公共组列表 (intersect) 并比较项目数,例如
when: my_groups|intersect(group_names)|length == my_groups|length
vars:
my_groups: [devices, router]
问:“Ansible 正在跳过每个主机的任务。”
答:这是正确的。引用自 Special Variables
<块引用>"group_names:当前主机所属的组列表"
在您的清单中,没有主机是 devices
和 router
的成员。结果,条件总是失败。例如
- hosts: router,dev1
tasks:
- debug:
var: group_names
- debug:
msg: OK
when:
- "'devices' in group_names"
- "'router' in group_names"
- debug:
msg: OK
when: "'devices' in group_names and 'router' in group_names"
- debug:
msg: OK
when: my_groups|intersect(group_names)|length == my_groups|length
vars:
my_groups: [devices, router]
给予
PLAY [router,dev1] *****************************************************
TASK [debug] ***********************************************************
ok: [router] =>
group_names:
- router
ok: [dev1] =>
group_names:
- devices
TASK [debug] ***********************************************************
skipping: [router]
skipping: [dev1]
TASK [debug] ***********************************************************
skipping: [router]
skipping: [dev1]
TASK [debug] ************************************************************
skipping: [router]
skipping: [dev1]
答案 1 :(得分:0)
部分问题在于您的条件语句没有按照您的想法执行。当你写:
"'devices' and 'router' in group_names"
你已经有效地写了:
('devices') and ('router' in group_names)
并且由于非零字符串计算为布尔值 true
,因此转换为:
(true) and ('router' in group_names)
你可以改写:
when: 'devices' in group_names and 'router' in group_names
或者:
when:
- 'devices' in group_names
- 'router' in group_names
答案 2 :(得分:-3)
所以感谢您的帮助和提示,我设法通过使用来解决问题
when: inventory_hostname == "device" or inventory_hostname == "router"
。
我会尝试其他解决方案以获得更持久或更高效的解决方案