Ansible将多个异步任务注册到同一变量

Ansible将多个异步任务注册到同一变量,ansible,Ansible,有没有办法将多个异步任务注册到同一个变量?例如,如果我有两个任务,每个任务调用一个异步shell命令: - name: Run async task 1 shell: echo "task 1" async: 30 poll: 0 register: db_wait - name: Run async task 2 shell: echo "task 2" async: 30 poll: 0 register: db_wa

有没有办法将多个异步任务注册到同一个变量?例如,如果我有两个任务,每个任务调用一个异步shell命令:

  - name: Run async task 1
    shell: echo "task 1"
    async: 30
    poll: 0
    register: db_wait

  - name: Run async task 2
    shell: echo "task 2"
    async: 30
    poll: 0
    register: db_wait

  - debug: msg="task vars {{db_wait}}"
当我打印db_wait变量时,它只包含一个任务的引用

 "msg": "task vars {u'started': 1, u'results_file': u'/home/vagrant/.ansible_async/202582702042.7326', u'ansible_job_id': u'202582702042.7326', u'changed': False}"

有没有一种方法可以为异步任务或某种列表注册相同的变量,我可以添加到其中,并在以后进行迭代?

我认为,如果您按照以下思路重新编写示例,您将能够完成所需的任务:

- name: run tasks 
  shell: {{ item }}
  async: 30
  poll: 0
  register: db_wait
  with_items:
    -  echo "task 1"
    -  echo "task 2"

由于这是一个在项目循环中迭代的单个任务,因此所有结果都将在同一个寄存器变量中结束。在您提供的示例中,变量将始终被第二个任务覆盖,因为任务是不同的。

我最终提出了以下解决方案,希望它可以帮助其他人。问题的核心是我需要在不同的主机上以不同的方式运行一些长时间运行的任务,但我只想在剧本的最后收集结果

对于要运行我的作业的剧本:

---
- name: Long Running tasks 1
  hosts: remote_host_1
  tasks:
    - name: Tasks 1
      shell: "{{item}}"
      with_items:
        - sleep 10
        - echo "Another Task"
      async: 3600
      poll: 0
      register: wait_task1


- name: Long Running tasks 2
  hosts: remote_host_2
  tasks:
    - name: Tasks 2
      shell: "{{item}}"
      with_items:
        - sleep 20
      async: 3600
      poll: 0
      register: wait_task2
最后的剧本是检查结果:

- name: Verify Async Tasks 1
  hosts: remote_host_1
  tasks:
    - include: "/ansible/plays/check_results.yml wait={{wait_task1}}"


- name: Verify Async Tasks 2
  hosts: remote_host_2
  tasks:
    - include: "/ansible/plays/check_results.yml wait={{wait_task2}}"
使用这种机制的人对检查结果似乎很熟悉:

---
- name: Check Results
  async_status: jid={{ item.ansible_job_id }}
  register: task_result
  until: task_result.finished
  retries: 120
  delay: 30
  failed_when: task_result.rc != 0
  with_items: wait.results  

这将异步启动所有任务,然后我们可以在每次播放结束时收集结果。

谢谢Bruce,但是我已经在我的任务中这样做了,这是我知道如何运行多个命令和获取回调的唯一方法。然而,在我的真实代码中,我有多个剧本,它们都有自己的异步任务,我想知道是否可以只使用一个变量来存储所有结果,并在剧本的末尾进行检查。