如何在Ansible中实现双数组嵌套循环创建客户端文件夹?
问题描述
我在Ansible中有如下vars文件:
for_create: client: ["VK","SB"] folders: ["toula","tina"] for_delete: client: ["VK","SB"] folders: ["invoices","scripts"] for_rename: client: ["VK", "SB"] old_name: ["home"] new_name: ["town"]
能否在Ansible中实现类似如下Ruby代码的嵌套循环功能?
clients = ["VK", "SB"] folders = ["toula","tina"] clients.each do |client| folders.each do |folder| puts "folder #{folder} for client #{client} created" end end
简言之,我希望为每个客户端创建["toula", "tina"]文件夹。尝试了很多方法都没实现这种双层循环,上述Ruby代码的输出如下:
folder toula for client VK created folder tina for client VK created folder toula for client SB created folder tina for client SB created
实现方案
在Ansible里可以通过嵌套循环轻松实现这个需求,下面是两种常用方式:
方式1:用loop结合product过滤器(Ansible 2.5及以上版本推荐)
利用product过滤器把客户端列表和文件夹列表做笛卡尔积,生成所有客户端-文件夹的组合,再遍历执行任务:
- name: 输出创建提示(模拟操作) debug: msg: "folder {{ item.1 }} for client {{ item.0 }} created" loop: "{{ for_create.client | product(for_create.folders) }}"
方式2:用with_nested(旧版Ansible兼容语法)
如果你的Ansible版本较低,可以用with_nested实现嵌套循环:
- name: 输出创建提示(模拟操作) debug: msg: "folder {{ item.1 }} for client {{ item.0 }} created" with_nested: - "{{ for_create.client }}" - "{{ for_create.folders }}"
实际创建文件夹的任务示例
如果要真正创建文件夹,把debug模块换成file模块即可:
- name: 为每个客户端创建对应文件夹 file: path: "/目标路径/{{ item.0 }}/{{ item.1 }}" state: directory mode: '0755' loop: "{{ for_create.client | product(for_create.folders) }}"
两种方式的执行输出都会和你给出的Ruby代码结果完全一致。
内容的提问来源于stack exchange,提问作者kostasew
相关产品推荐
相关产品推荐

