我有一部剧本需要在我的整个清单上运行,并带有主机名列表作为额外变量(target_hosts
)。
target_hosts
中的主机均在其上定义了group_id
hostvar。我使用整个清单,因为与group_id
var对应的一些辅助主机需要按组配置以在一个部分中匹配。
group_id
列表中的主机通常会有多个target_hosts
值。我需要选择正确的辅助主机清单组,然后导入/运行一个剧本,以在主剧本的中途配置两组服务器。
这是我目前正在做的事情:
include_playbook: group-configure.yaml
vars:
src_hosts: "group-{{ group_id }}-ancillary-1"
dest_hosts: "{{ target_hosts }}"
我目前必须手动将target_hosts
和group_id
分开,然后分别运行一次主游戏。这有很多不必要的开销。
我真正想要执行的是:
for each group of hosts from `target_hosts` with the same `group_id` hostvar:
import and run group-configure.yaml with:
src_hosts: "ancillary-{{ group_id }}"
target_hosts: restricted to those with that value of `group_id`'
我该怎么做?如果当前的结构化方法行不通,最好的替代方法是什么?
答案 0 :(得分:2)
我非常确定add_host:
与groupby
组合在一起就是您要寻找的东西,这将使您能够按其属性汇总那些主机,然后像对待它们那样对它们运行剧本组已经定义:
- hosts: localhost
connection: local
gather_facts: no
become: no
vars:
list_of_name_groups: >-
{%- set results = [] -%}
{%- for g_id, items in (dict(hostvars) | dict2items | groupby("value.group_id")) -%}
{%- for hostname in (items | map(attribute="key") | list) -%}
{%- set _ = results.append({"group_id": g_id, "hostname": hostname}) -%}
{%- endfor -%}
{%- endfor -%}
{{ results }}
tasks:
- add_host:
name: '{{ item.hostname }}'
groups: ancillary-{{ item.group_id }}
with_items: '{{ list_of_name_groups }}'
- hosts: ancillary-my-awesome-groupid
# etc etc