我有以下情况。
我有这样的清单(仅限于相关信息):
[management]
management-1 vhost_ip=10.0.0.1
[database]
db-1 vhost_ip=10.0.1.1
db-2 vhost_ip=10.0.1.2
[application]
app-1 vhost_ip=10.0.2.1
app-2 vhost_ip=10.0.2.2现在我需要创作一个这样的剧本:
- name: Setup management server
hosts: management
become: true
roles:
- management
database_ips:
- 10.0.1.1
- 10.0.1.1
application_ips:
- 10.0.2.1
- 10.0.2.1如您所见,我的管理角色需要一个按角色分组的所有IP的列表。
我的存货里已经有这些IP了。
有没有办法进行转换,以提取这些IP并将其转化为列表?所以我可以这样称呼它(基于高阶列表的伪代码):
roles:
- management
database_ips: {{ groups['databse']->map->vhost_ip }}
application_ips: {{ groups['application']->map->vhost_ip }}还有可能做一些类似的事情,但使用这样一种更复杂的格式(将vhost_ip从inventory映射到参数中的ip,将alias映射到参数中的name ):
roles:
- management
database_hosts:
- name: db-1
ip: 10.0.1.1
- name: db-2
ip: 10.0.1.1发布于 2022-03-24 21:34:20
是的,使用应用于特殊变量 hostvars的一组合适的过滤器可以很容易地实现这一点。
我们要应用的一组过滤器是:
dict2items,这样我们就可以列出hostvars字典的列表,以便对其进行筛选。groupsmap。因此,我们最终得到了这些变量:
application_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.application)
| map(attribute='value.vhost_ip')
}}
database_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.database)
| map(attribute='value.vhost_ip')
}}
management_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.management)
| map(attribute='value.vhost_ip')
}}至于更复杂的需求,您可以使用json_query和JMESPath查询。
application_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.application)
| json_query('[].{name: key, ip: value.vhost_ip}')
}}
database_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.database)
| json_query('[].{name: key, ip: value.vhost_ip}')
}}
management_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.management)
| json_query('[].{name: key, ip: value.vhost_ip}')
}}考虑到剧本:
- hosts: all
gather_facts: no
tasks:
- debug:
msg:
application_ips: "{{ application_ips }}"
database_ips: "{{ database_ips }}"
management_ips: "{{ management_ips }}"
vars:
application_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.application)
| map(attribute="value.vhost_ip")
}}
database_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.database)
| map(attribute="value.vhost_ip")
}}
management_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.management)
| map(attribute="value.vhost_ip")
}}
run_once: true
delegate_to: localhost
- debug:
msg:
application_ips: "{{ application_ips }}"
database_ips: "{{ database_ips }}"
management_ips: "{{ management_ips }}"
vars:
application_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.application)
| json_query('[].{name: key, ip: value.vhost_ip}')
}}
database_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.database)
| json_query('[].{name: key, ip: value.vhost_ip}')
}}
management_ips: >-
{{
hostvars
| dict2items
| selectattr('key', 'in', groups.management)
| json_query('[].{name: key, ip: value.vhost_ip}')
}}
run_once: true
delegate_to: localhost这产生了:
TASK [debug] ******************************************************
ok: [node2 -> localhost] =>
msg:
application_ips:
- 10.0.2.1
- 10.0.2.2
database_ips:
- 10.0.1.1
- 10.0.1.2
management_ips:
- 10.0.0.1
TASK [debug] ******************************************************
ok: [node2 -> localhost] =>
msg:
application_ips:
- ip: 10.0.2.1
name: app-1
- ip: 10.0.2.2
name: app-2
database_ips:
- ip: 10.0.1.1
name: db-1
- ip: 10.0.1.2
name: db-2
management_ips:
- ip: 10.0.0.1
name: management-1https://stackoverflow.com/questions/71608812
复制相似问题