在Ansible中,可以使用with_items
来循环执行任务,并且可以通过delegate_to
参数将任务委派给特定的主机。要在循环中并行执行这些委派任务,可以使用async
和poll
参数。
下面是一个示例代码:
---
- name: Parallel execution with delegate_to loop
hosts: localhost
gather_facts: false
tasks:
- name: Create temporary directory
tempfile:
state: directory
register: temp_dir
- name: Generate list of hosts
set_fact:
hosts_list: "{{ groups['webservers'] }}"
- name: Parallel task with delegate_to loop
command: echo "Hello from {{ inventory_hostname }}"
async: 60
poll: 0
delegate_to: "{{ item }}"
with_items: "{{ hosts_list }}"
register: async_result
- name: Wait for async tasks to complete
async_status:
jid: "{{ item.ansible_job_id }}"
loop: "{{ async_result.results }}"
register: async_status_result
until: async_status_result.finished
retries: 30
delay: 5
- name: Print async task results
debug:
var: item.stdout
loop: "{{ async_status_result.results }}"
在上面的示例中,我们首先创建一个临时目录,并将其注册到temp_dir
变量中。然后,我们使用set_fact
模块生成一个主机列表,这里假设我们有一个名为webservers
的主机组。
接下来,我们使用command
模块在循环中执行委派任务。通过将async
参数设置为60和poll
参数设置为0,我们将任务设置为异步执行且无需等待结果。delegate_to
参数用于指定将任务委派给哪个主机。在这个例子中,我们使用item
来引用主机列表中的每个主机。
然后,我们使用async_status
模块来等待异步任务完成。async_status
模块的jid
参数用于指定任务的ID,我们可以从async_result
变量中的ansible_job_id
字段获取该值。通过将retries
参数设置为30和delay
参数设置为5,我们将重试等待异步任务完成的操作。
最后,我们使用debug
模块打印异步任务的结果。在这个例子中,我们打印每个异步任务的stdout
字段。
请注意,上面的示例中delegate_to
参数使用的是静态主机列表。如果要动态确定要委派任务的主机,可以根据需求使用动态变量或条件判断来设置delegate_to
参数。