我有一个包含网络上主机详细信息的变量(称为“主机列表”-我相信您将其称为字典,但我不确定术语。该变量在 group_vars/all 的文件中定义,所以它是在所有剧本中都可用(不确定这是否重要)。
我有一个剧本,只有在 hostlist 的主机名列表中找不到 ansible_hostname 时我才想运行它。hostlist 中的主机名是变量的属性之一,但我再次不确定“属性”是否是正确的术语......
主机列表定义为:
hostlist:
- { name: 'host1', ip_addr: '192.168.2.31', hostgrp: 'physical_workstation' }
- { name: 'host2', ip_addr: '192.168.2.32', hostgrp: 'physical_workstation' }
- { name: 'host3', ip_addr: '192.168.2.33', hostgrp: 'virtual_machine' }
我用来尝试使其正常工作的游戏是:
- name: Conditional test
debug:
msg: "ansible_hostname not found in hostlist."
when: ansible_hostname not in hostlist.name
我不确定条件中所需的语法,或者我想要的是否可以通过这种方式实现?
大概有更优雅的方式来做这件事,但这样的事情对我有用:
如果您的库存文件如下所示
然后,只有以下内容的剧本才会被运行,
host4
因为它在 hostlist var 中不匹配:$ cat test.yml
当这样调用时:
意味着只有 host4 运行任务块....
可选地,此条件更清洁
如果您想与库存别名列表进行比较,请使用
inventory_hostname
而不是。ansible_hostname
请参阅inventory_hostname 和 ansible_hostname 之间的区别。另一种解决方案是(如对问题的评论中所建议的)是将主机列表重构到清单中,如下所示:
然后,您可以简化 playbook 以使用特殊组对不属于任何组的主机运行播放,该组从不属于任何其他组的
ungrouped
主机中选择主机:all
或针对组中的特定主机运行操作...
输出