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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 20:33:31