Ansible - 运行 以 with_together 方式针对主机的任务

Ansible - Run Task Against Hosts in a with_together Fashion

我目前正在使用两台主机并将它们动态添加到一个组中,然后是一个使用 with_togethersynchronize 任务,以并行使用 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 次操作。

我需要它像这样同步:

这意味着它是一个 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)与当前在索引中索引的主机匹配时才执行任务名单。

结果是该游戏仅针对每个主机以串行方式与具有相同索引的其他列表项运行一次。