【问题标题】:Ansible Loop over dictionaries and listsAnsible 循环遍历字典和列表
【发布时间】:2019-03-19 19:20:40
【问题描述】:

我有一个格式如下的变量文件:

files:
   name: file1
   size: 50K
   location:
     - /var/tmp
     - /nfsvol
     - /tmp
    users:
     - user1
     - user2
     - user3

我希望使用字典和列表上的一些循环以下列方式生成任务文件,并且可以将其传递给 playbook:

- name: Build File Repo
  file_repo:
     name: file1
     size: 50K
     location:
       - user1
       - user2
       - user3
     users:
       - /var/tmp
       - /nfs_vol
       - /tmp

var 文件可以包含许多“文件”块,我希望任务文件使用任务文件中指定的循环遍历整个 var 文件,以便每个块都可以在指定的主机上执行。

Var 文件可以是这样的:

files:
   name: file1
   size: 50K
   location:
     - /var/tmp
     - /nfsvol
     - /tmp
    users:
     - user1
     - user2
     - user3

files:
   name: file2
   size: 53K
   location:
     - /var/tmp
     - /nfsvol
   users:
     - user5
     - user21

我尝试使用子元素并遵循以下线程,但它不符合我的目的; Nested loop with a list and a dictionary

【问题讨论】:

    标签: ansible


    【解决方案1】:

    这是不可能的

    使用任务中指定的循环遍历整个 var 文件

    在哪里

    var 文件可以包含许多“文件”块

    不可能有“许多”变量命名为“文件”。将所有“块”放入列表并循环:“{{ files }}”

    files:
      - name: file1
        size: 50K
        location:
          - /var/tmp
          - /nfsvol
          - /tmp
        users:
          - user1
          - user2
          - user3
      - name: file2
        size: 53K
        location:
          - /var/tmp
          - /nfsvol
        users:
          - user5
          - user21
    

    下面的任务可能就是你想要的。

    tasks:
      - name: Touch files
        file:
          path: "{{ item.1 }}/{{ item.0.name }}"
          state: touch
        loop: "{{ lookup('subelements', files, 'location') }}"
    

    【讨论】:

    • 我同意,因为我尝试了多种方法来满足上述要求,因为文件是自动输出的,我需要将文件传递给任务以执行剧本。我会写一个小接口把文件转换成需要的格式。
    猜你喜欢
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 2019-07-10
    相关资源
    最近更新 更多