Ansible 运行meta:在循环中刷新\u库存?

Ansible 运行meta:在循环中刷新\u库存?,ansible,libvirt,Ansible,Libvirt,我正在使用Ansible和a在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 - nam

我正在使用Ansible和a在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\u 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
,它以JSON格式输出
的清单信息。我们解析它,查找
ansible\u主机
,并验证它是一个ip地址


一旦我们知道资源清册源能够报告所有节点的ip地址,我们就调用
refresh\u inventory

不幸的是,这个主题似乎很清楚:
不支持元任务循环。
。所以我猜
直到
循环属于这一类。您是否考虑过首先在包含元任务的include上循环并设置一个事实,直到该事实为真?这是一种工作环境,但可能值得一试……事实证明,在
包含任务
之前,您也不能使用