等待 with_lines 中每个项目的处理程序 - Ansible
Wait for handler for every item in with_lines - Ansible
Ansible 版本:ansible 2.4.2.0
我想根据角色顺序启动 VM(master/backup)。多个 VM ID 存储在 2 个文件 master
和 backup
中。控制器流程应该如下所示
- 从文件中逐一迭代 VM ID
- 对于每次迭代,处理程序都应该通知。即迭代应该 WAIT for handler complete
- 如果处理程序失败(或处于 WAITING 状态),迭代不应移动前言。
作为参考,你看下面的剧本
- 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
对于上面的剧本,我看到的是在整个迭代完成后通知处理程序。
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!!!
中的虚拟命令不等待。这就是为什么我必须手动检查状态。
默认情况下,处理程序在播放结束时 运行。
但是,您可以使用 meta 模块强制已通知的处理程序在游戏中的给定时间 运行。
- name: force running of all notified handlers now
meta: flush_handlers
在您的情况下,您只需将它添加到两个 vm 启动任务之间
编辑:这实际上可以在您的两个任务之间工作,但不能用于单个任务中的每次迭代,因此它并不能真正满足您的全部要求。
另一种方法(待开发)是将您的检查命令直接包含在您的任务中,在满足条件之前不应 return。
您是否考虑过探索 openstack related modules 的星系?他们也可能会解决您当前的问题。
Ansible 版本:ansible 2.4.2.0
我想根据角色顺序启动 VM(master/backup)。多个 VM ID 存储在 2 个文件 master
和 backup
中。控制器流程应该如下所示
- 从文件中逐一迭代 VM ID
- 对于每次迭代,处理程序都应该通知。即迭代应该 WAIT for handler complete
- 如果处理程序失败(或处于 WAITING 状态),迭代不应移动前言。
作为参考,你看下面的剧本
- 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
对于上面的剧本,我看到的是在整个迭代完成后通知处理程序。
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!!!
中的虚拟命令不等待。这就是为什么我必须手动检查状态。
默认情况下,处理程序在播放结束时 运行。
但是,您可以使用 meta 模块强制已通知的处理程序在游戏中的给定时间 运行。
- name: force running of all notified handlers now
meta: flush_handlers
在您的情况下,您只需将它添加到两个 vm 启动任务之间
编辑:这实际上可以在您的两个任务之间工作,但不能用于单个任务中的每次迭代,因此它并不能真正满足您的全部要求。
另一种方法(待开发)是将您的检查命令直接包含在您的任务中,在满足条件之前不应 return。
您是否考虑过探索 openstack related modules 的星系?他们也可能会解决您当前的问题。