Ждите обработчик для каждого элемента в with_lines - Ansible
Ansible версия: ansible 2.4.2.0
Хочу запускать ВМ последовательно, зависит от роли (мастер / бэкап). Несколько идентификаторов виртуальных машин хранятся в 2 файлах master
& backup
, Контроллер потока должен выглядеть ниже
- Итерация идентификаторов виртуальных машин одна за другой из файла
- Для каждой итерации обработчик должен получать уведомления. то есть итерация должна ждать завершения обработчика
- Итерация не должна перемещать предисловие, если обработчик не выполнен (или находится в состоянии 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? Они также могут решить ваши текущие проблемы.