Ansible如何加载多个本地YML文件并合并其中的数组内容
Ansible拆分配置合并方案
问题原因
- bbb、ddd任务无输出的核心原因是路径不匹配:
find模块指定的搜索路径为production/configs/,但你实际存放拆分配置的目录是production/split_configs/,导致find_results.files返回空列表,遍历空列表自然没有输出。 - 你原本的
set_fact数组合并思路是可行的,只需要补充两个调整:首先初始化空的my_array数组,其次读取文件时将yaml字符串解析为Ansible变量,不要直接拼接文件内容。
最优实现代码
修改后的playbook如下:
- hosts: myservers pre_tasks: - name: merge ansible arrays tags: always delegate_to: localhost block: # 初始化空数组 - name: init empty my_array set_fact: my_array: [] - name: find config files find: # 修正为实际存放配置的目录路径 paths: production/split_configs/ patterns: '*.yml' register: find_results - name: load and merge array from all config files set_fact: my_array: "{{ my_array + (lookup('file', item.path) | from_yaml).my_array }}" loop: "{{ find_results.files }}" tasks: - name: eee debug: msg: "{{ my_array }}"
提示:如果还是出现路径找不到的问题,可以把路径替换为基于playbook目录的绝对路径:
paths: "{{ playbook_dir }}/production/split_configs/",保证不管在哪个目录执行playbook都能正确找到配置文件。如果需要合并后去重,可以把拼接逻辑修改为{{ (my_array + (lookup('file', item.path) | from_yaml).my_array) | unique }}。
内容的提问来源于stack exchange,提问作者martin
相关产品推荐
相关产品推荐

