运行 元:refresh_inventory 在循环中?

Running meta: refresh_inventory in a loop?

我正在使用带有 dynamic inventory plugin 的 Ansible 在 libvirt 中构建一些虚拟机。创建机器后,我需要等待它们获取 ip 地址。我不能简单地这样做:

- wait_for_connection:

因为在创建虚拟机后,它们不会立即拥有 IP 地址。我需要做的是:

- name: wait until node has acquired an address
  meta: refresh_inventory
  until: ansible_host|ipaddr
  retries: 30
  delay: 1

- name: wait until node has finished booting
  wait_for_connection:

也就是说,我需要等到每个主机的清单信息都包含ansible_host中的地址。不幸的是,上述任务不起作用:它只执行一次并继续。

我可以硬编码延迟:

- pause:
    seconds: 30

但我希望在这里进行更积极的检查,以避免不必要的延误(如果事情花费的时间比预期的时间长,则会出现问题)。

在摆弄了一下之后,这就是我最终做的事情:

- hosts: ovn
  gather_facts: false
  tasks:
    - name: wait for nodes to acquire addresses
      delegate_to: localhost
      command: >-
        ansible-inventory --host {{ inventory_hostname }}
      register: nodecheck
      changed_when: false
      until: >-
        (nodecheck.stdout|from_json).ansible_host|default('')|ipaddr
      retries: 30
      delay: 1

    - meta: refresh_inventory

这会重复调用 ansible-inventory --host <host>,它会以 JSON 格式输出 <host> 的库存信息。我们解析它,寻找 ansible_host,并确认它是一个 IP 地址。

一旦我们知道清单源能够报告所有节点的 IP 地址,我们就会调用 refresh_inventory