如何在Salt State中遍历Windows Minion上的指定目录
问题分析
你原来的代码存在几个核心问题:
- 直接对字符串
'D:\Myfolder'做循环,会逐个遍历字符串的字符,而非目录下的子项 file.absent的参数格式错误,应该用- name:而非- name =- 条件判断永远不会触发,因为循环的是单个字符,不可能等于
"Something"
解决方案
要在Salt State中实现类似PowerShellGet-ChildItem的目录遍历,可直接调用Salt内置的file.find模块(在Minion本地执行,无需cmd.run/cmd.script),以下是两种常用实现:
1. 精准删除指定名称的子目录
如果只需要删除D:\Myfolder下名为Something的子目录,可通过file.find定位目标路径后执行删除:
{% set target_parent = 'D:\\Myfolder' %} {# 查找目标目录下名为Something的一级子目录 #} {% set target_dir = salt['file.find'](target_parent, name='Something', type='d', maxdepth=1) %} {% if target_dir %} Delete_Something_Folder: file.absent: - name: {{ target_dir[0] }} {% endif %}
2. 遍历所有子目录并按需处理
如果需要遍历D:\Myfolder下所有一级子目录,再根据名称筛选处理:
{% set parent_dir = 'D:\\Myfolder' %} {# 获取父目录下所有一级子目录,maxdepth=1表示不递归深层目录 #} {% set all_subdirs = salt['file.find'](parent_dir, type='d', maxdepth=1) %} {% for dir_path in all_subdirs %} {# 提取子目录的名称(从路径末尾截取) #} {% set dir_name = dir_path.split('\\')[-1] %} {# 可自定义筛选条件,比如删除名称包含特定关键词的目录 #} {% if dir_name == 'Something' %} Delete_{{ dir_name }}: file.absent: - name: {{ dir_path }} {% endif %} {% endfor %}
关键说明
salt['file.find']是Salt的Minion端内置模块,直接在目标Windows机器上执行文件查找,无需依赖外部命令- 路径中的反斜杠需用双反斜杠
\\转义,避免Jinja解析错误 maxdepth=1限制只查找一级子目录,若需要递归遍历所有子目录,可移除该参数或设置更大的数值- 每个
file.absent任务的ID(如Delete_Something)需保证唯一,避免State执行时出现冲突
内容的提问来源于stack exchange,提问作者cmoe
相关产品推荐
相关产品推荐

