为一组主机变量中的每个唯一值运行一个导入的Ansible剧本

时间:2018-12-31 22:55:55

标签: ansible ansible-facts

我有一部剧本需要在我的整个清单上运行,并带有主机名列表作为额外变量(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_hostsgroup_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`'

我该怎么做?如果当前的结构化方法行不通,最好的替代方法是什么?

1 个答案:

答案 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