等待with_lines中每个项目的处理程序-Ansible

时间:2019-05-02 16:00:47

标签: ansible ansible-handlers

Ansible版本:ansible 2.4.2.0

我要顺序启动VM取决于角色(主服务器/备份)。多个VM ID存储在2个文件masterbackup中。控制器流程应如下所示

  1. 从文件一个接一个地迭代VM ID
    • 对于每次迭代,处理程序都应通知。即迭代应等待以完成处理程序
    • 如果处理程序失败(或处于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!!!中的虚拟命令不会等待。这就是为什么我必须手动检查状态。

1 个答案:

答案 0 :(得分:0)

默认情况下,处理程序在播放结束时运行。

不过,您可以使用meta模块来强制已通知的处理程序在播放中的给定时间运行。

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

在您的情况下,您只需要在两个虚拟机启动任务之间添加它

编辑:这实际上将在您的两个任务之间起作用,但不适用于单个任务中的每次迭代,因此实际上并不能满足您的全部要求。

另一种方法(待开发)是将您的检查命令直接包含在任务中,直到满足条件时该命令才返回。

您是否考虑过探索openstack related modules的星系?他们也可以解决您当前的问题。