Mar*_*ark 2 ansible ansible-inventory
我需要将库存中的特定主机作为参数传递给角色。主机是组的一部分,但由其他主机都没有的变量划分。
片段:hosts.yml
dbservers:
hosts:
pg01:
ansible_host: pg01.domain.com
master_slave: master
pg02:
ansible_host: pg02.domain.com
master_slave: slave
Run Code Online (Sandbox Code Playgroud)
我希望能够根据变量 master_slave 设置为“master”来解析 pg01,这样我就可以调用这样的角色:
- name: Do something
include_role:
name: a.database.role.to.run.on.master
vars:
master_database_host: {{ something that resolves to pg01 }}
Run Code Online (Sandbox Code Playgroud)
如何从清单中解析合适的主机?
您可以使用混合过滤器来提取您需要的主机:
tasks:
- debug:
msg: '{{groups["group_name"] | map("extract", hostvars) | selectattr("master_slave", "equalto", "master") | map(attribute="inventory_hostname") | list}}'
Run Code Online (Sandbox Code Playgroud)
一步步:
groups["group_name"]是组中所有主机的列表group_name。
map("extract", hostvars)获取主机变量,一个将主机映射到它们的变量的字典,并提取group_name(即groups["group_name"])中的主机。这会生成一个包含group_name映射到其变量的主机的列表。
selectattr("master_slave", "equalto", "master")选择属性master_slave等于 的所有主机master。这会生成一个列表,其中包含所有主机映射到其变量的主机。
map(attribute="inventory_hostname")将列表作为输入并返回inventory_hostname每个项目的属性。这会生成一个包含所有主机的列表。