我将 X次委托给主机的 group 组执行。在这种情况下,它会耗尽我所有幸福的所有套接字(又称实例)上的服务器:
- name: HAproxy drain node
haproxy:
state: drain
host: '{{ inventory_hostname }}'
socket: "{{ item[1] }}"
backend: "{{ backend_name | default(omit) }}"
wait: yes
delegate_to: "{{ item[0] }}"
loop: "{{ groups[lb_haproxy]|product(socketstats.stdout_lines)|list }}"
register: lbmemberstatus
它可以工作,但是是连续的。因此,我尝试将其应用为模式“一劳永逸” 并等待:一个异步任务,其中pool = 0,第二个任务 async_status 循环第一个任务的结果任务。
但是,就我而言,我没有成功使其工作:
- name: HAproxy drain node
haproxy:
state: drain
host: '{{ inventory_hostname }}'
socket: "{{ item[1] }}"
backend: "{{ backend_name | default(omit) }}"
wait: yes
wait_retries: 12
delegate_to: "{{ item[0] }}"
loop: "{{ groups[lb_haproxy]|product(socketstats.stdout_lines)|list }}"
register: lbmemberstatus
async: 1000 # Maximum runtime in seconds.
poll: 0 # Fire and continue (never poll)
- name: Wait for drain on all Haproxies
async_status:
jid: "{{ item[1].ansible_job_id }}"
register: lbmemberstatus_poll_results
until: lbmemberstatus_poll_results.finished
retries: 300
delegate_to: "{{ item[0] }}"
loop: "{{ groups[lb_haproxy]|product(lbmemberstatus.results)|list }}"
很显然,当委派的主机与运行作业的主机不匹配时,此示例将失败。
你会怎么做?
答案 0 :(得分:0)
您应该遍历lbmemberstatus.results
,但不要构造groups[lb_haproxy]
和lbmemberstatus.results
的新产品,它们当然可以混合在一起。
循环的注册结果(在您的情况下为lbmemberstatus.results
)始终包含用于该特定迭代的原始项。
尝试:
- debug:
msg: "Host: {{ item.item[0], JobId: {{ item.ansible_job_id }}"
loop: "{{ lbmemberstatus.results }}"
在这里,我们将item
作为lbmemberstatus.results
的元素,并将item.item
作为上一个循环使用的元素。