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

如何通过Ansible比对两个CSV的MAC地址生成指定格式CSV文件

解答

完全可以通过Ansible实现该CSV匹配整合需求,核心逻辑是读取两个源文件后,将MAC地址做大小写归一化作为关联键匹配对应字段,按要求格式拼接后输出为第三个CSV文件。

实现要点

  • 逐行解析两个CSV文件,拆分字段时自动去除前后多余空格
  • 由于两个源文件的MAC地址存在大小写差异,匹配前统一将MAC转为大写(或小写),避免匹配遗漏
  • 按指定的字段顺序拼接匹配成功的条目,最终写入目标文件

可直接运行的Playbook示例

- name: 按MAC地址关联整合两个CSV
  hosts: localhost
  gather_facts: false
  vars:
    csv1_path: "./csv1"
    csv2_path: "./csv2"
    csv3_path: "./csv3"
  tasks:
    - name: 读取两个源文件内容
      slurp:
        src: "{{ item }}"
      loop: ["{{ csv1_path }}", "{{ csv2_path }}"]
      register: raw_csv_content

    - name: 解析CSV1,以大写MAC为键存储字段
      set_fact:
        csv1_dict: "{{ csv1_dict | default({}) | combine({mac_key: {'name': name, 'nic': nic, 'mac': mac_val}}) }}"
      loop: "{{ (raw_csv_content.results[0].content | b64decode).splitlines() | reject('search', '^CSV1:') | select('match', '\\S') | list }}"
      vars:
        line_fields: "{{ item.split(',') | map('strip') | list }}"
        name: "{{ line_fields[0] }}"
        nic: "{{ line_fields[1] }}"
        mac_val: "{{ line_fields[2] | upper }}"
        mac_key: "{{ mac_val }}"

    - name: 解析CSV2,以大写MAC为键存储字段
      set_fact:
        csv2_dict: "{{ csv2_dict | default({}) | combine({mac_key: {'host': host, 'eth': eth, 'dpdk': dpdk}}) }}"
      loop: "{{ (raw_csv_content.results[1].content | b64decode).splitlines() | reject('search', '^CSV2:') | select('match', '\\S') | list }}"
      vars:
        line_fields: "{{ item.split(',') | map('strip') | list }}"
        host: "{{ line_fields[0] }}"
        eth: "{{ line_fields[1] }}"
        dpdk: "{{ line_fields[2] }}"
        mac_val: "{{ line_fields[3] | upper }}"
        mac_key: "{{ mac_val }}"

    - name: 拼接CSV3的所有行
      set_fact:
        csv3_content: "{{ csv3_content | default(['CSV3:']) + ['%s, %s, %s, %s, %s, %s' | format(csv1_dict[item].name, csv2_dict[item].host, csv1_dict[item].nic, csv1_dict[item].mac, csv2_dict[item].eth, csv2_dict[item].dpdk)] }}"
      loop: "{{ csv1_dict.keys() | list }}"

    - name: 写入最终CSV3文件
      copy:
        content: "{{ csv3_content | join('\n    ') }}"
        dest: "{{ csv3_path }}"

运行效果

执行上述playbook后,生成的csv3文件内容和预期完全一致:

CSV3:
    ABC, UVW, NIC.Slot.1-1-1:, A6:C3:4F:8E:D5:30, ethernet15:2, ABC_DPDK1
    DEF, XYZ, NIC.Slot.1-2-1:, B2:D5:8C:5A:43:60, ethernet15:3, ABC_DPDK2

如果后续CSV字段中存在包含逗号的特殊场景,可将手动split解析的逻辑替换为Ansible内置的read_csv模块,兼容性更好。

内容的提问来源于stack exchange,提问作者Noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 09:15:36