2017-02-08 22 views
0

Я создаю сборник пьес с этой игрой:анзибль: как позвонить в модуль `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_hostbypasses the play host loop and only runs once for all the hosts in the play.

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

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

EDIT: Пример воспроизвести его на компьютере с только локальный

Создать файл /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) в второй игре?

ответ

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 выполняется для каждого хоста.

+0

Argh! Я не против запуска «гипервизоров» в сериале, это было так просто! БЛАГОДАРЯ! –

0

Я решил эту проблему (с моим примером-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