ansible - ansible 中的嵌套循环 - Vcloud 总监

标签 ansible

以下是一个 ansible 任务,它返回 VCD vapp 中的虚拟机列表。我将结果存储在变量“all_vms”中。

- name: List VMs of VCD VAPP
  vcd_vapp:
    vapp_name: test
    host: lab.vcd
    operation: "list_vms"
  register: all_vms

变量“all_vms”的输出是如下所示的字典列表:

  "msg": [
        {
            "deployed": true,
            "ip_address": "192.168.0.151",
            "name": "esxi-67u1-1",
            "status": "POWERED_ON"
        },
        {
            "deployed": true,
            "ip_address": "192.168.0.150",
            "name": "vcsa-67u1",
            "status": "POWERED_ON"
        }
    ]

我需要检查所有虚拟机的状态是否均为 POWERED_ON,如果不是全部,我需要重复上述任务。我怎样才能做到这一点?

我尝试了 block ,但无法循环 block ?希望获得有关如何根据返回的输出重试任务的一些指示。

  block:
      - name: List VMs of VCD VAPP
        vcd_vapp:
          vapp_name: test
          host: labs.vcd
          operation: "list_vms"
        register: all_vms
      - name: Check if VMs are powered on
        set_fact:
          poweron_pending = "yes"
        loop: "{{ all_vms.msg }}"
        when: item.status != "POWERED_ON"
    until: poweron_pending == "yes"

最佳答案

如果您决定使用until,您还必须使用retries 设置最大循环。我认为您可以通过使用 json_query 过滤结果在单个任务中实现这一目标。并计算它们,重复该任务,直到得到一个空列表。

总体思路如下:

- name: List VMs of VCD VAPP
  vcd_vapp:
    vapp_name: test
    host: lab.vcd
    operation: "list_vms"
  register: all_vms
  retries: 100
  until: >-
    {{ all_vms | json_query("[?status!='POWERED_ON']") | length == 0 }}

免责声明:我没有可供测试的 vcd。我只根据您提到的数据结构测试了我的查询。使用 retries/until 可能会改变您注册的 var,并且您可能必须将上述 json 查询调整为确切的数据结构。

关于ansible - ansible 中的嵌套循环 - Vcloud 总监,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56553254/

相关文章:

git - 使用 become/become_user 的 Ansible 2.1.0 无法设置临时文件的权限

ruby - 使用 Ansible 安装 Bundler gem

Ansible 如何根据条件设置条件或 var

ansible - 尝试使用 ansible 构建包时找不到命令

ansible - 从符合条件的 ansible 字典列表中过滤元素

Ansible 在运行 play 之前启动 ssh-copy-id?

azure - Ansible 安装所有必需的 Azure 模块

Ansible:冒号后有空格时 lineinfile 语法错误(:)

loops - 如何在ansible循环中跳过空值

ansible - 如何将ansible变量传递给vagrant