У меня есть следующее:
- hosts: all
gather_facts: false
vars:
list_of_groups:
- group_1
- group_2
tasks:
- name: debug
debug:
msg: "Host group {{ item }} has host {{ groups[item] }}"
loop: "{{ list_of_groups }}"
delegate_to: localhost
run_once: true
В моем инвентарном файле группа group_1
имеет 3 хоста, а группа group_2
имеет 2 хоста. В настоящее время указанная выше задача выполняется 2 раза (по одному разу для каждой группы). И при каждом запуске он показывает все хосты в этой конкретной группе. Но я хочу, чтобы он запускался 5 раз (потому что у меня 5 хостов). И при каждом запуске он должен показывать только 1 отдельный хост, а не все хосты в группе.
@ U880D: Вместо отладки я хочу использовать другой модуль, но для устранения неполадок я использовал отладку. Я действительно хочу использовать его в playbook, а не получать результаты с помощью инструментов командной строки.
Обратите внимание, что все вышеперечисленное выглядит как антипаттерн и проблема X/Y. Но, чтобы ответить на ваш прямой вопрос, в двух словах:
- hosts: localhost
gather_facts: false
vars:
list_of_groups:
- group1
- group2
tasks:
- name: Do something with host in given groups
debug:
msg: "I'm doing something for {{ item }}"
loop: "{{ q('ansible.builtin.inventory_hostnames', list_of_groups | join(':')) }}"
Given the inventory
shell> cat hosts
[group_1]
host_a
host_b
host_c
[group_2]
host_d
host_e
and the list of the groups
list_of_groups:
- group_1
- group_2
извлечь и сгладить списки
list_of_hosts: "{{ list_of_groups|map('extract', groups)|flatten }}"
дает вам список, который вы хотите повторить
list_of_hosts:
- host_a
- host_b
- host_c
- host_d
- host_e
Example of a complete playbook for testing
shell> cat pb.yml
- hosts: all
vars:
list_of_groups:
- group_1
- group_2
list_of_hosts: "{{ list_of_groups|map('extract', groups)|flatten }}"
tasks:
- debug:
var: list_of_hosts
run_once: true
- debug:
msg: "I'm doing something for {{ item }}"
loop: "{{ list_of_hosts }}"
run_once: true
gives
shell> ansible-playbook pb.yml
PLAY [all] ***********************************************************************************
TASK [debug] *********************************************************************************
ok: [host_a] =>
list_of_hosts:
- host_a
- host_b
- host_c
- host_d
- host_e
TASK [debug] *********************************************************************************
ok: [host_a] => (item=host_a) =>
msg: I'm doing something for host_a
ok: [host_a] => (item=host_b) =>
msg: I'm doing something for host_b
ok: [host_a] => (item=host_c) =>
msg: I'm doing something for host_c
ok: [host_a] => (item=host_d) =>
msg: I'm doing something for host_d
ok: [host_a] => (item=host_e) =>
msg: I'm doing something for host_e
PLAY RECAP ***********************************************************************************
host_a: ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Q: "It should also print the group."
A: intersect list_of_groups and group_names
- debug:
msg: "I'm doing something for {{ item }} which is a member of {{ my_groups }}"
loop: "{{ list_of_hosts }}"
vars:
my_groups: "{{ hostvars[item].group_names|intersect(list_of_groups) }}"
run_once: true
gives (abridged)
msg: I'm doing something for host_a which is a member of ['group_1']
msg: I'm doing something for host_b which is a member of ['group_1']
msg: I'm doing something for host_c which is a member of ['group_1']
msg: I'm doing something for host_d which is a member of ['group_2']
msg: I'm doing something for host_e which is a member of ['group_2']
Я думаю, что я недостаточно ясно выразился в своем вопросе, извините за это. Он должен печатать не только хост, но и группу: «Я делаю что-то для <host>, который является членом <group>».
Хост может быть членом нескольких групп. Вы хотите напечатать их все (кроме всех и разгруппированных)? Смотрите group_names в Специальные переменные.
Нет, не все группы. Только группы, указанные в "list_of_groups".
Я добавил пример.
Без какой-либо дополнительной информации о вашем варианте использования и о том, чего вы пытаетесь достичь, в настоящее время для меня это выглядит так, как будто вы пытаетесь повторно реализовать существующие функции из
ansible-inventory all --graph
,ansible-inventory group_1 --graph
,ansible-inventory group_2 --graph
,ansible-inventory --toml --list
и т. д.. См. также ansible-inventory.