Ansible中使用query模块循环读文件及提取YAML标签的方法咨询
解决方案
核心思路
- 可靠获取目标目录下的所有文件列表,避免字符串分割带来的潜在问题
- 遍历每个文件,分别读取内容并针对性处理(.properties用INI解析、YAML文件用YAML解析)
- 将所有文件的处理结果合并到一个变量中,方便后续使用
完整Playbook示例
- name: Read and process all files in target directory hosts: appserver vars: logs_dir: /properties # 存储所有文件的处理结果,键为文件名,值为文件内容或提取的特定标签 logs: {} tasks: - name: Get list of target files (supports .properties and .yaml/.yml) set_fact: target_files: "{{ query('fileglob', logs_dir + '/*.properties') + query('fileglob', logs_dir + '/*.{yaml,yml}') }}" - name: Debug file list (optional) debug: var: target_files - name: Read and process each file set_fact: logs: "{{ logs | combine({ item | basename: file_content }) }}" loop: "{{ target_files }}" vars: # 读取当前文件的原始内容 raw_content: "{{ lookup('file', item) }}" # 根据文件后缀处理内容 file_content: >- {% if item ends with '.yaml' or item ends with '.yml' %} {{ raw_content | from_yaml | json_query('log_config') }} # 提取YAML中的`log_config`标签,按需修改 {% elif item ends with '.properties' %} {{ raw_content | ini(section='', key='log_level') }} # 提取.properties中的`log_level`键,按需修改 {% else %} {{ raw_content }} # 其他文件直接保留原始内容 {% endif %} - name: Debug final processed logs (optional) debug: var: logs
关键细节说明
- 文件列表获取:用
query('fileglob')直接返回文件路径列表,比lookup+split更稳定,避免路径含逗号时的分割错误;同时支持同时匹配.properties和YAML文件,可按需调整匹配规则。 - 遍历处理:通过
loop遍历所有文件,替代原Playbook中硬编码的单个文件索引,实现批量处理。 - 文件内容解析:
- YAML文件:用
from_yaml过滤器将文本转为字典,再用json_query提取特定标签(示例中提取log_config,可根据实际YAML结构修改)。 - .properties文件:该格式属于INI文件的一种,用
ini过滤器解析并提取指定键值(示例中提取log_level,可修改section和key参数)。
- YAML文件:用
- 结果存储:用
combine过滤器将每个文件的处理结果合并到logs字典中,键为文件名(通过basename过滤器提取),便于后续按文件检索内容。
自定义调整建议
- 如果需要提取YAML中的其他标签,修改
json_query的参数,比如要提取app.name则写json_query('app.name')。 - 如果要完整保留.properties文件的所有键值对,去掉
ini过滤器的key参数,写成raw_content | ini(section=''),会返回整个文件的键值字典。 - 若目标目录下还有其他格式文件,可在
file_content的条件判断中添加对应处理逻辑。
内容的提问来源于stack exchange,提问作者rahul verma
相关产品推荐
相关产品推荐

