运行 元: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
。
我正在使用带有 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
。