在ansible中同时运行任务(不是循环)



我在一个可解析的剧本中有三个任务,它们足够独特,我无法将它们封装在一个循环中。为了简单起见,我们假设他们在云提供商中创建三个不同的VM实例,并且每个任务都有一个特定的配置

- name: Create VM set A
cloud_provider.vm:
{stuff here}
- name: Create VM set B
cloud_provider.vm:
{stuff here}
- name: Create VM set C
cloud_provider.vm:
{stuff here}

现在这可以工作了,并创建了三组虚拟机,但我想并行运行它们,这样我就不用等那么久了(虚拟机运行几个启动过程,需要一段时间(

我看过

https://docs.ansible.com/ansible/latest/collections/ansible/builtin/async_status_module.html#async-状态模块

https://docs.ansible.com/ansible/latest/user_guide/playbooks_async.html

但它们似乎使用了循环,我在这里不能这样做,因为不同的集合非常不同。

如何/可以异步执行这些任务?

Q:">它们似乎使用循环,而我在这里不能这样做,因为不同的集合非常不同。如何/可以异步执行这些任务">

A: 您可以使用循环来等待任务。例如

- hosts: localhost
tasks:
- shell: 'sleep 5 && echo VMA created'
async: 1000
poll: 0
register: cmd_result_A
- shell: 'sleep 9 && echo VMB created'
async: 1000
poll: 0
register: cmd_result_B
- shell: 'sleep 7 && echo VMC created'
async: 1000
poll: 0
register: cmd_result_C
- async_status:
jid: '{{ item }}'
register: result
until: result.finished
retries: 20
delay: 1
loop:
- "{{ cmd_result_A.ansible_job_id }}"
- "{{ cmd_result_B.ansible_job_id }}"
- "{{ cmd_result_C.ansible_job_id }}"
- debug:
msg: >-
{{ item.start.split(' ')|last }} -
{{ item.end.split(' ')|last }} |
stdout: {{ item.stdout }}
loop: "{{ result.results }}"

给出(节略(

msg: '13:31:13.477444 - 13:31:18.483527 | stdout: VMA created'
msg: '13:31:13.722892 - 13:31:22.728505 | stdout: VMB created'
msg: '13:31:14.001067 - 13:31:21.008131 | stdout: VMC created'

为了简化代码,您可能也想尝试循环执行任务。例如

- shell: "{{ item }}"
async: 1000
poll: 0
register: cmd_result
loop:
- 'sleep 5 && echo VMA created'
- 'sleep 9 && echo VMB created'
- 'sleep 7 && echo VMC created'
- async_status:
jid: '{{ item }}'
register: result
until: result.finished
retries: 20
delay: 1
loop: "{{ cmd_result.results|map(attribute='ansible_job_id')|list }}"

最新更新