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 响应,多个相同的字典