如何在Ansible中合并两个数据库服务器列表文件?
Ansible实现db服务器版本列表合并
下面是一套可以实现需求的Ansible Playbook,核心思路是读取两个文件并解析为按环境标识(envX)映射的字典,再按环境标识匹配拼接后写入新文件:
完整Playbook代码
--- - name: 合并db1和db2服务器版本列表 hosts: localhost gather_facts: no tasks: # 读取两个源文件内容并按行拆分 - name: 读取db1_list文件 set_fact: db1_lines: "{{ lookup('file', './db1_list').splitlines() }}" - name: 读取db2_list文件 set_fact: db2_lines: "{{ lookup('file', './db2_list').splitlines() }}" # 将db1的行解析为字典:key是env标识(如env1),value是完整行内容 - name: 构建db1环境-行映射字典 set_fact: db1_map: "{{ db1_map | default({}) | combine({ item.split('-')[1].split(':')[0]: item }) }}" loop: "{{ db1_lines }}" # 同理构建db2的环境-行映射字典 - name: 构建db2环境-行映射字典 set_fact: db2_map: "{{ db2_map | default({}) | combine({ item.split('-')[1].split(':')[0]: item }) }}" loop: "{{ db2_lines }}" # 按排序后的环境标识拼接db1和db2的对应行 - name: 生成合并后的内容列表 set_fact: merged_lines: "{{ merged_lines | default([]) + [ db1_map[env] + ', ' + db2_map[env] ] }}" loop: "{{ db1_map.keys() | sort }}" loop_control: loop_var: env # 将合并内容写入目标文件 - name: 写入合并后的文件 copy: content: "{{ merged_lines | join('\n') }}" dest: "./merged_db_list.txt"
代码说明
- 读取文件:用
lookup('file')读取本地文件,splitlines()将内容拆分为行列表 - 构建映射字典:通过拆分每行的字符串(
split('-')和split(':'))提取环境标识(如env1)作为key,将整行内容作为value,确保后续能按环境精准匹配 - 合并内容:遍历排序后的环境标识,拼接对应db1和db2的行内容,保证输出顺序一致
- 写入文件:用
copy模块将合并后的行列表转为字符串后写入目标文件
注意事项
- 确保
db1_list和db2_list文件路径正确,Playbook执行时能访问到这两个文件 - 假设所有环境标识(envX)在两个文件中都存在,若存在缺失场景,可在拼接步骤添加判断(如
db2_map.get(env, 'db2-' + env + ': 未找到'))
内容的提问来源于stack exchange,提问作者Philip Shangguan
相关产品推荐
相关产品推荐

