Хосты печати в группе с Ansible

У меня есть следующее:

- 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 отдельный хост, а не все хосты в группе.

Без какой-либо дополнительной информации о вашем варианте использования и о том, чего вы пытаетесь достичь, в настоящее время для меня это выглядит так, как будто вы пытаетесь повторно реализовать существующие функции из ansible-inventory all --graph, ansible-inventory group_1 --graph, ansible-inventory group_2 --graph, ansible-inventory --toml --list и т. д.. См. также ansible-inventory.

U880D 18.01.2023 12:21

@ U880D: Вместо отладки я хочу использовать другой модуль, но для устранения неполадок я использовал отладку. Я действительно хочу использовать его в playbook, а не получать результаты с помощью инструментов командной строки.

C-nan 18.01.2023 12:23
Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
1
2
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Обратите внимание, что все вышеперечисленное выглядит как антипаттерн и проблема 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>».

C-nan 19.01.2023 09:49

Хост может быть членом нескольких групп. Вы хотите напечатать их все (кроме всех и разгруппированных)? Смотрите group_names в Специальные переменные.

Vladimir Botka 19.01.2023 09:52

Нет, не все группы. Только группы, указанные в "list_of_groups".

C-nan 19.01.2023 09:57

Я добавил пример.

Vladimir Botka 19.01.2023 10:15

Другие вопросы по теме