在组中的主机之间分发列表的元素(ansible)

时间:2015-03-31 13:20:41

标签: ansible ansible-playbook

我的懒惰有问题。

我有一份类似的任务列表。它们只是名称不同。假设它是一个文件夹名称。

---
- vars:
   folders:
    - folder1
    - folder2
    - etc
  hosts:
   - host1
   - host2
   - etc

我想以某种方式在主机之间分发'文件夹'。例如循环赛。

我希望在角色扮演手册中有类似的内容:

- name: Create folder
  file: path={{item}} state=directory
  use_next_from: folders

如何为ansible表达'use_next_from'?谢谢!

3 个答案:

答案 0 :(得分:0)

如果你只是想在一堆主机上创建一堆文件夹,那么你真的只需要创建一个常规任务并在所有主机上运行它:

- hosts: all
  tasks:
    - name: create folder
      file: path={{ item }} state=directory
      with_items: folders

如果您需要创建嵌套循环以在每个主机上执行更复杂的操作,那么您可以使用with_nested构造:

vars:
    folders:
        - folder1
        - folder2
    files:
        - file1
        - file2

tasks:
    - name: create folder
      file: path={{ item }} state=directory
      with_items: folders

    - name: create files in each folder
      file: path={{ item[0] }}/{{ item[1] }} state=touch
      with_nested:
        - folders
        - files

如果你想做某事"循环赛"风格那么它会变得更加困难。 Ansible旨在执行所有已定义主机上的所有任务。你可能需要做一些相当复杂的事情:

vars:
    folders:
        - folder1
        - folder2
    files:
        - file1
        - file2
tasks:
    - name: create folder
      file: path={{ item[0] }} state=directory
      when: ansible_inventory_hostname == item[1]
      with_nested:
        - folders
        - hosts

答案 1 :(得分:0)

你想要循环。 RTM on loops

如果布鲁斯的帖子没有回答你的问题,那么也许你想要Looping over Parallel Sets of Data

答案 2 :(得分:0)

自Ansible 2.5起,loop_controlindex_var指令。然后,您可以执行以下操作:

---
- vars:
   folders:
    - folder1
    - folder2
    - etc
  hosts:
   - host1
   - host2
   - etc

- tasks:
  - name: Create folder
    file:
      path: "{{item}}"
      state: directory
    loop: "{{folders}}"
    loop_control:
      index_var: index
    when: inventory_hostname == hosts[index % hosts|length]

例如,当您要从清单中定位主机组时,可以在hosts语句中将groups.example替换为when