如何解析具有特定属性的库存成员?

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)

如何从清单中解析合适的主机?

Ala*_*aye 6

您可以使用混合过滤器来提取您需要的主机:

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每个项目的属性。这会生成一个包含所有主机的列表。