有没有办法将多个异步任务注册到同一个变量?例如,如果我有两个任务,每个任务都调用一个async 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}"
有没有办法为异步任务注册相同的变量或我可以添加的某种列表,并且可以在以后迭代?
答案 0 :(得分: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
这会异步启动所有任务,然后我们可以在每次游戏结束时收集结果。
答案 1 :(得分:1)
我认为你能够做你想做的唯一方法就是如果你按照以下方式改写你的例子:
- name: run tasks
shell: {{ item }}
async: 30
poll: 0
register: db_wait
with_items:
- echo "task 1"
- echo "task 2"
由于这是一个迭代一个项循环的单个任务,因此所有结果将以相同的寄存器变量结束。在您提供的示例中,变量将始终被第二个任务覆盖,因为任务是不同的。