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

时间:2017-09-21 19:51:59

标签: ansible rsync

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

我需要它像这样同步:

  • /tmp/remote/source/one/上的remoteSrc1复制/tmp/remote/dest/one/ remoteDest1
  • /tmp/remote/source/two/上的remoteSrc2复制/tmp/remote/dest/two/ remoteDest2

这意味着它是1:1的比例;基本上以with_together对列表的方式对主机进行操作。

主机是动态获取的,所以我不能为每个主机制作不同的游戏。

由于synchronize基本上是rsync的简化版本,如果直接使用rsync有一个简单的解决方案,那么我们将非常感激。

1 个答案:

答案 0 :(得分:0)

这没有本机功能,所以这就是我解决它的方法:

根据原始任务,添加以下两行:

  - "{{ 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语句中使用它们来执行任务。

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