如何有条件地检查 openstack 实例的状态

How to conditionally check the state of an openstack instance

我正在尝试有条件地检查我的 playbook 中 openstack 云实例的状态。

剧本将云实例的名称作为参数,然后通过使用 nova compute 将状态设置为不存在来将其删除。我想要做的是检查状态是否已经不存在(比如输入了一个不存在的实例的名称)以跳过该语句。我该怎么写?

- nova_compute
     name: "{{item}}"
     state: absent
  with_items: "{{instance_name}}"
  when: ???

我不熟悉 openstack 任务,但看起来这应该不是很难做到。首先,如果您想做的只是终止所有实例,并且由于某些实例已经不存在而出现错误,那么只需忽略错误就足够了:

- nova_compute
     name: "{{item}}"
     state: absent
  with_items: "{{instance_name}}"
  ignore_errors: yes

如果您不想这样做,那么您需要将其分成多个任务,一个检查实例的状态,另一个终止它们。

Ansible 文档看起来最近针对 Ansible 2.0 进行了更新,所以我不确定模块名称是否已充分更改,但考虑到当前记录的内容,我建议使用 task to gather facts对于所讨论的实例。如果任务 returns 出现错误,那么实例不存在,这正是你真正想要的,所以像这样的东西应该可以工作:

- os_server_facts
      name: "{{instance_name}}"
      register: instance_state
      ignore_errors: yes

然后你可以这样做:

- nova_compute
      name: "{{instance_name}}"
      state: absent
      when: instance_state is not defined 

根据 instance_state 的第一个任务 returns,您可能希望 when 子句更加结构化。我建议 运行 进行一些测试并通过 debug module 输出 instance_state 以查看您是否需要执行超出我在此提供的内容的操作。

如果您需要对实例列表执行此操作,您也应该能够稍微扩展任务来执行此操作。这些方面的东西(显然我还没有实际测试过这些,所以它们可能不是 100% 正确):

- os_server_facts
      name: "{{item}}"
      register: instance_state
      ignore_errors: yes
      with_items: "{{instance_list}}"

- nova_compute
      name: "{{item}}"
      state: absent
      when: instance_state[item] is not defined 
      with_items: "{{instance_list}}"