Ждите обработчик для каждого элемента в with_lines - Ansible

Ansible версия: ansible 2.4.2.0

Хочу запускать ВМ последовательно, зависит от роли (мастер / бэкап). Несколько идентификаторов виртуальных машин хранятся в 2 файлах master & backup, Контроллер потока должен выглядеть ниже

  1. Итерация идентификаторов виртуальных машин одна за другой из файла
    • Для каждой итерации обработчик должен получать уведомления. то есть итерация должна ждать завершения обработчика
    • Итерация не должна перемещать предисловие, если обработчик не выполнен (или находится в состоянии WAITING).

Для справки, вы видите ниже Playbook

- name: Performs Power Actions VMs
  hosts: localhost
  vars:
    - status: "{% if action=='stop' %}SHUTOFF{% else %}ACTIVE{% endif %}"   # For Checking VM status

  tasks:
  - name: Staring Master VM
    shell: |
      echo {{ item }} > /tmp/current
      echo "RUN nova start {{ item }} HERE!!!"
    when: action == "start"
    with_lines: cat ./master
    notify: "Poll VM power status"

  - name: Starting Backup VM
    shell: |
      echo {{ item }} > /tmp/current
      echo "RUN nova start {{ item }} HERE!!!"
    when: action == "start"
    with_lines: cat ./backup
    notify: "Poll VM power status"

  handlers:
  - name: Poll VM power status
    shell: openstack server show -c status --format value `cat /tmp/current`
    register: cmd_out
    until: cmd_out.stdout == status
    retries: 5
    delay: 10

Для вышеприведенного playbook я вижу, что обработчики уведомляются после завершения всей итерации.


PLAY [Performs Power Actions on ESC VMs] **********************************************************************************************

TASK [Stopping Backup VM] *********************************************************************************************************
skipping: [localhost] => (item=Test) 

TASK [Stopping Master VM] *********************************************************************************************************
skipping: [localhost] => (item=Test) 

TASK [Staring Master VM] **********************************************************************************************************
changed: [localhost] => (item=Test)

TASK [Starting Backup VM] *********************************************************************************************************
changed: [localhost] => (item=Test)

TASK [Removing tmp files] *************************************************************************************************************
changed: [localhost] => (item=./master)
changed: [localhost] => (item=./backup)

RUNNING HANDLER [Poll VM power status] ********************************************************************************************
FAILED - RETRYING: Poll ESC VM power status (5 retries left).
^C [ERROR]: User interrupted execution

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

PS: пустышка в заданиях RUN nova start {{ item }} HERE!!! не ждет Вот почему я должен проверить статус вручную.

1 ответ

Решение

По умолчанию обработчики запускаются в конце игры.

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

- name: force running of all notified handlers now
  meta: flush_handlers

В вашем случае вам просто нужно добавить его между двумя задачами запуска VM

Редактировать: это на самом деле будет работать между вашими двумя задачами, но не для каждой итерации в одной задаче, так что это на самом деле не отвечает вашим полным требованиям.

Другой подход (который будет разработан) будет включать вашу команду проверки непосредственно в вашу задачу, которая не должна возвращаться, пока не будут выполнены условия.

Рассматривали ли вы исследование галактики модулей, связанных с openstack? Они также могут решить ваши текущие проблемы.

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