Ansible 循环遍历字典和列表

Posted

技术标签:

【中文标题】Ansible 循环遍历字典和列表【英文标题】:Ansible Loop over dictionaries and lists 【发布时间】: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

【问题讨论】:

【参考方案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') "

【讨论】:

我同意,因为我尝试了多种方法来满足上述要求,因为文件是自动输出的,我需要将文件传递给任务以执行剧本。我会写一个小接口把文件转换成需要的格式。

以上是关于Ansible 循环遍历字典和列表的主要内容,如果未能解决你的问题,请参考以下文章

Ansible - 通过循环注册 GET 响应,多个相同的字典

Ansible 嵌套循环 - 如何遍历循环项?

Ansible如何从字典列表中找出字典

使用 ansible 访问字典文件的 yaml 列表

ansible自动化运维详解ansible中的任务执行控制及实例演示:循环条件判断触发器处理失败任务

ansible自动化运维详解ansible中的任务执行控制及实例演示:循环条件判断触发器处理失败任务