在多委托主机上执行异步多任务

时间:2019-02-08 07:05:39

标签: ansible

我将 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 循环第一个任务的结果任务。

但是,就我而言,我没有成功使其工作:

  • 异步作业分布在所有委派的主机上。因此,我等待这些委派的主机(async_status任务的第一个循环)。
  • 我等待每个工作,通过循环 lbmemberstatus.results 来获取它。但是在此作业列表中,作业来自不同的委托主机。
- 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 }}"

很显然,当委派的主机与运行作业的主机不匹配时,此示例将失败。

你会怎么做?

1 个答案:

答案 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作为上一个循环使用的元素。