Ansible: как вызвать модуль add_host для всех хостов игры

Я создаю пьесу с этой пьесой:

На хостах hypervisors:

  • получить список виртуальных машин со всех хостов
  • используйте модуль add_host, чтобы добавить их всех в новую группу инвентаря под названием guests

Мой инвентарь:

[hypervisors]
host1
host2

Моя книга:

- hosts: hypervisors
  - shell: virsh list | awk 'NR>2' | awk '{print $2}'
    register: result_virsh
  - add_host:
      name: "{{ item }}"
      group: "guests"
    with_items: "{{ result_virsh.stdout_lines }}"

Модуль add_host обходит цикл хоста воспроизведения и запускается только один раз для всех хостов в воспроизведении.

Затем он вызывается один раз (для host1), это частный случай использования этого модуля (см. Ссылку выше), как если бы переменная run_once была неявно зафиксирована на true.

Как я могу использовать его для всех хостов в группе hypervisors?

РЕДАКТИРОВАТЬ: пример воспроизведения его на вашем компьютере только с localhost

Создайте файл / tmp / host1_test для имитации возвращения гостей vm1 и vm2:

vm1
vm2

Создайте файл / tmp / host2_test для имитации возвращения гостей vm3 и vm4:

vm3
vm4

Используйте этот инвентарь (test_add_host.ini) с двумя хостами, оба с фиксированным IP-адресом 127.0.0.1:

[hypervisors]
host1 ansible_host=127.0.0.1 test_filename=/tmp/host1_test
host2 ansible_host=127.0.0.1 test_filename=/tmp/host2_test

Воспользуйтесь этим учебником (test_add_host.yml):

- hosts: hypervisors
  gather_facts: no
  tasks:
  - shell: "cat {{ test_filename }}"
    register: result_virsh
  - add_host:
      name: "{{ item }}"
      group: "guests"
    with_items: "{{ result_virsh.stdout_lines }}"

- hosts: guests
  gather_facts: no
  tasks:
  - local_action: ping

Вызовите эту книгу локально с помощью команды:

ansible-playbook -c local -i test_add_host.ini test_add_host.yml
  • Хосты первого игрового вызова host1 и host2
  • Хосты второго вызова воспроизведения vm1 и vm2

Что мне делать, чтобы вызвать все хосты (vm1, vm2, vm3 и vm4) во второй игре?


person Nelson G.    schedule 08.02.2017    source источник


Ответы (3)


Как вы заметили, есть кое-что о add_host: BYPASS_HOST_LOOP = True.
Так что это своего рода принудительное run_once.

Если вы не против последовательного выполнения hypervisors, вы можете просто использовать serial: 1:

- hosts: hypervisors
  serial: 1
  tasks:
    - shell: virsh list | awk 'NR>2' | awk '{print $2}'
      register: result_virsh
    - add_host:
        name: "{{ item }}"
        group: "guests"
      with_items: "{{ result_virsh.stdout_lines }}"

Это гарантирует, что каждый пакет воспроизведения состоит только из одного хоста, поэтому add_host выполняется для каждого хоста.

person Konstantin Suvorov    schedule 08.02.2017
comment
Ага! Я не против запустить hypervisors в последовательном режиме, это было на самом деле так просто! БЛАГОДАРНОСТЬ! - person Nelson G.; 08.02.2017

Если вы не хотите запускать игру последовательно, вы можете объединить результаты с помощью ansible_play_hosts и map. Результаты можно использовать в следующем спектакле.

- hosts: all
  gather_facts: false
  tasks:
    - shell: virsh list | awk 'NR>2' | awk '{print $2}'
      register: result_virsh
      changed_when: false

    - add_host:
        name: "{{ item }}"
        group: guests
      changed_when: false
      loop: "{{ ansible_play_hosts | map('extract', hostvars, 'result_virsh') | map(attribute='stdout_lines') | flatten }}"

- hosts: guests
  gather_facts: false
  tasks:
    - ping:

Этот ответ был получен из Ansible: собирать выходные данные по нескольким хостам в задаче запустить.

person GargantuChet    schedule 25.07.2019

Я решил эту проблему (с моим примером localhost) с помощью следующей книги. Это решение очень сложное, если у вас есть более простое, поделитесь им!

Я не хотел использовать динамическую инвентаризацию

# Get list of virtual machines in hostvars[inventory_hostname].vms
- hosts: hypervisors
  gather_facts: no
  tasks:
    - shell: "cat {{ test_filename }}"
      register: result_virsh
    - set_fact:
        vms: "{{ result_virsh.stdout_lines }}"

# Remove previous vm_hosts file
- hosts: localhost
  gather_facts: no
  tasks:
    - file:
        path: /tmp/vm_hosts
        state: absent

# Build file vm_hosts with list of virtual machines in serial (working in parallele with same file cause some troubles)
- hosts: hypervisors
  gather_facts: no
  serial: 1
  tasks:
    - block:
        - file:
            path: /tmp/vm_hosts
            mode: 0644
            state: touch
          run_once: yes
        - lineinfile:
            dest: /tmp/vm_hosts
            line: '{{ item }}'
          with_items: "{{ hostvars[inventory_hostname].vms }}"
      delegate_to: localhost

# Add list of virtual machines from file vm_hosts to in-memory inventory
- hosts: localhost
  gather_facts: no
  tasks:
  - add_host:
      name: "{{ item }}"
      group: "guests"
    with_lines: cat /tmp/vm_hosts

- hosts: guests
  gather_facts: no
  tasks:
    - local_action: ping
person Nelson G.    schedule 08.02.2017