Запустите импортированный сценарий воспроизведения Ansible для каждого уникального значения в наборе переменных хоста.

У меня есть playbook, который нужно запустить для всего моего инвентаря, со списком имен хостов в качестве дополнительной переменной (target_hosts).

На всех хостах в target_hosts определена group_id переменная хоста. Я использую весь инвентарь, потому что некоторые вспомогательные хосты, которые соответствуют group_id var, нуждаются в конфигурации каждой группы для соответствия в одном разделе.

Часто с хостами в списке target_hosts будет несколько group_id значений. Мне нужно выбрать правильную группу инвентаризации вспомогательных хостов и импортировать / запустить playbook для настройки обоих наборов серверов на полпути через основную playbook.

Вот чем я сейчас занимаюсь:

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`'

Как я могу это сделать? Если нынешний способ ее структурирования не работает, какой альтернативный подход лучше всего?


person Captain Blammo    schedule 31.12.2018    source источник


Ответы (1)


Я почти уверен, что add_host: в сочетании с _ 2_ - это то, что вы ищете, что позволит вам объединить эти хосты по их атрибуту, а затем запустите playbook против них, как если бы эта группа уже была определена:

- 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
person mdaniel    schedule 01.01.2019