Ждите обработчик для каждого элемента в with_lines - Ansible - PullRequest
0 голосов
/ 02 мая 2019

Ansible Version: ansible 2.4.2.0

Я хочу, чтобы виртуальная машина запускалась последовательно в зависимости от роли (мастер / резервная копия).Несколько идентификаторов виртуальных машин хранятся в 2 файлах master & backup.Поток контроллера должен выглядеть следующим образом:

  1. Перебирать идентификаторы виртуальной машины один за другим из файла
    • Для каждой итерации обработчик должен получать уведомления.то есть итерация должна WAIT для завершения обработчика
    • Итерация не должна перемещать предисловие, если обработчик не выполнен (или находится в состоянии 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 Ответ

0 голосов
/ 02 мая 2019

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...