ansible - 如何在ansible playbook中的when条件下使用主机变量
问题描述
只有当主机名具有变量时,我才尝试执行我的任务servers=admin
。
我正在尝试执行以下剧本,但遇到错误。
我正在尝试这个,因为它类似于对我有用的东西inventory_hostname in groups['production']
。我只想在服务器变量包含admin
在其中时运行任务。
我的主机文件:
[production]
host1 servers=admin,server1
host2 servers=server2
host3 servers=admin,server3
host4 servers=server4
host5 servers=server5
host6 servers=admin,server6
我的任务:
- name: run cmd
shell: hostname
register: op
when:
- inventory_hostvars in servers['admin']
我的任务应该只在host1
,host3
和上运行host6
。
解决方案
servers
是一个包含您在每个主机上声明的字符串的变量。如果你对 eg 运行 taks,host3
它将等于admin,server3
. 您正在寻找的条件是
when: "'admin' in servers"
# or
when: servers is search('admin')
现在,我认为您只是在重新发明轮子,因为正如您自己指出的那样,您可以通过小组更轻松、更清晰地实现这一目标。例如,与仅寻址组名称相比,上述解决方案会使获取变量中admin
某处的所有服务器的列表变得更加困难。servers
my_admin_servers: "{{ groups['prod'] | map('extract', hostvars) | selectattr('servers', 'search', 'admin') | map(attribute='inventory_hostname') | list }}"
我会这样做:
您的库存
[production]
host1
host2
host3
host4
host5
host6
[admin]
host1
host3
host6
还有你的新条件:
when: inventory_hostname in groups['admin']
推荐阅读
- excel - 为什么代码没有点击按钮?
- c# - 将 DeflateStream 文件内容发送到 Azure 消息队列
- matlab - 如何从另一个函数定义变量?
- reactjs - this.SetState 在多次调用中未定义
- python-3.x - 如何修复 docker 上与 pygame 相关的“pygame.error:没有可用的视频设备”错误?
- css - 如何防止实时调整图像大小(在页面加载期间)
- postman - 如何重命名使用 npm 包 newman-reporter-csv 生成的 newman csv 报告
- c - 优化 32 位值构造
- javascript - Android根符号调整大小
- python - 将具有特殊格式的文本文档转换为 Pandas DataFrame