Ansible - 运行 以 with_together 方式针对主机的任务
Ansible - Run Task Against Hosts in a with_together Fashion
我目前正在使用两台主机并将它们动态添加到一个组中,然后是一个使用 with_together
的 synchronize
任务,以并行使用 3 个包含 2 个元素的列表在两个主机之间复制指定的文件远程服务器。
下面是一个基于这个想法的例子:
---
- name: Configure Hosts for Copying
hosts: localhost
gather_facts: no
tasks:
- name: Adding given hosts to new group...
add_host:
name: "{{ item }}"
groups: copy_group
with_items:
- ["remoteDest1", "remoteDest2"]
- name: Copy Files between servers
hosts: copy_group
gather_facts: no
tasks:
- name: Copying files...
synchronize:
src: "{{ item[1] }}"
dest: "{{ item[2] }}"
with_together:
- ["remoteSrc1", "remoteSrc2"]
- ["/tmp/remote/source/one/", "/tmp/remote/source/two/"]
- ["/tmp/remote/dest/one/", "/tmp/remote/dest/two/"]
delegate_to: "{{ item[0] }}"
目前,它对两台服务器都进行了两种操作,结果是 4 次操作。
我需要它像这样同步:
- 在
remoteDest1
上将 /tmp/remote/source/one/
从 remoteSrc1
复制到 /tmp/remote/dest/one/
- 在
remoteDest2
上将 /tmp/remote/source/two/
从 remoteSrc2
复制到 /tmp/remote/dest/two/
这意味着它是一个 1:1 比率;基本上以与 with_together
对列表相同的方式作用于主机。
主机是动态获取的,所以我不能为每个主机做不同的播放。
既然synchronize
本质上是rsync
的简化版本,那么如果有直接使用rsync
的简单解决方案,那么将不胜感激。
本机没有此功能,所以我是这样解决的:
给定原始任务,添加以下两行:
- "{{ groups['copy_group'] }}"
when: inventory_hostname == item[3]
获取:
- name: Copying files...
synchronize:
src: "{{ item[1] }}"
dest: "{{ item[2] }}"
with_together:
- ["remoteSrc1", "remoteSrc2"]
- ["/tmp/remote/source/one/", "/tmp/remote/source/two/"]
- ["/tmp/remote/dest/one/", "/tmp/remote/dest/two/"]
- "{{ groups['copy_group'] }}"
delegate_to: "{{ item[0] }}"
when: inventory_hostname == item[3]
本质上,通过将主机添加为列表,它们可以在 when
语句中使用,仅当当前主机(inventory_hostname
)与当前在索引中索引的主机匹配时才执行任务名单。
结果是该游戏仅针对每个主机以串行方式与具有相同索引的其他列表项运行一次。
我目前正在使用两台主机并将它们动态添加到一个组中,然后是一个使用 with_together
的 synchronize
任务,以并行使用 3 个包含 2 个元素的列表在两个主机之间复制指定的文件远程服务器。
下面是一个基于这个想法的例子:
---
- name: Configure Hosts for Copying
hosts: localhost
gather_facts: no
tasks:
- name: Adding given hosts to new group...
add_host:
name: "{{ item }}"
groups: copy_group
with_items:
- ["remoteDest1", "remoteDest2"]
- name: Copy Files between servers
hosts: copy_group
gather_facts: no
tasks:
- name: Copying files...
synchronize:
src: "{{ item[1] }}"
dest: "{{ item[2] }}"
with_together:
- ["remoteSrc1", "remoteSrc2"]
- ["/tmp/remote/source/one/", "/tmp/remote/source/two/"]
- ["/tmp/remote/dest/one/", "/tmp/remote/dest/two/"]
delegate_to: "{{ item[0] }}"
目前,它对两台服务器都进行了两种操作,结果是 4 次操作。
我需要它像这样同步:
- 在
remoteDest1
上将 - 在
remoteDest2
上将
/tmp/remote/source/one/
从 remoteSrc1
复制到 /tmp/remote/dest/one/
/tmp/remote/source/two/
从 remoteSrc2
复制到 /tmp/remote/dest/two/
这意味着它是一个 1:1 比率;基本上以与 with_together
对列表相同的方式作用于主机。
主机是动态获取的,所以我不能为每个主机做不同的播放。
既然synchronize
本质上是rsync
的简化版本,那么如果有直接使用rsync
的简单解决方案,那么将不胜感激。
本机没有此功能,所以我是这样解决的:
给定原始任务,添加以下两行:
- "{{ groups['copy_group'] }}"
when: inventory_hostname == item[3]
获取:
- name: Copying files...
synchronize:
src: "{{ item[1] }}"
dest: "{{ item[2] }}"
with_together:
- ["remoteSrc1", "remoteSrc2"]
- ["/tmp/remote/source/one/", "/tmp/remote/source/two/"]
- ["/tmp/remote/dest/one/", "/tmp/remote/dest/two/"]
- "{{ groups['copy_group'] }}"
delegate_to: "{{ item[0] }}"
when: inventory_hostname == item[3]
本质上,通过将主机添加为列表,它们可以在 when
语句中使用,仅当当前主机(inventory_hostname
)与当前在索引中索引的主机匹配时才执行任务名单。
结果是该游戏仅针对每个主机以串行方式与具有相同索引的其他列表项运行一次。