如何通过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
相关产品推荐
相关产品推荐

