You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:48:17