我正在使用ansible将CSV文件转换为YML

CSV文件

test.csv

Ansible Playbook

---
- hosts: localhost
  connection: local
  gather_facts: false
  become: false
  vars:
    csvfile: "{{ lookup('file', 'test.csv') }}"
  tasks:
    - name: Parse CSV To YAML
      template:
        src: "./iterate_csv_test.j2"
        dest: "./test.yml"
      run_once: true

Jinja2文件“iterate_csv_test.j2”

nodes:

{% for row in csvfile.split('\n') %}
{%   if loop.index != 1 %}
{%     set list = row.split(',') %}
  {{list[0]}}:       
    interfaces: 
      {{list[1]}}: {nbr: '{{list[2]}}', nbr_int: '{{list[3]}}'} 
{%   endif %}
{% endfor %}

输出test.yml

nodes:

  Router1:
    interfaces:
      xe-1/0/0: {nbr: 'Router3', nbr_int: 'xe-0/0/4'}

  Router1:
    interfaces:
      xe-1/0/1: {nbr: 'Router4', nbr_int: 'xe-0/0/10'}

  Router2:
    interfaces:
      xe-1/0/2: {nbr: 'Router3', nbr_int: 'xe-3/0/5'}

  Router2:
    interfaces:
      xe-3/0/0: {nbr: 'Router4', nbr_int: 'xe-0/1/4'}

所以现在我有我的test.yml文件从CSV文件生成,并且如图所示节点重复两次,就像在CSV文件中一样,但我需要将同一节点的所有接口分组在此节点下看起来像

nodes:

  Router1:
    interfaces:
      xe-1/0/0: {nbr: 'Router3', nbr_int: 'xe-0/0/4'}
      xe-1/0/1: {nbr: 'Router4', nbr_int: 'xe-0/0/10'}

  Router2:
    interfaces:
      xe-1/0/2: {nbr: 'Router3', nbr_int: 'xe-3/0/5'}
      xe-3/0/0: {nbr: 'Router4', nbr_int: 'xe-0/1/4'}

所以,我将Jinja2代码修改为如下,但它给了我相同的结果 . 你能帮我做这个工作吗?

nodes:

{% set curr_node = 'none' %}
{% for row in csvfile.split('\n') %}
{%   if loop.index != 1 %}
{%     set list = row.split(',') %}
{%     set new_node = list[0] %}
{%     if new_node != curr_node %}
  {{list[0]}}:       
    interfaces: 
      {{list[1]}}: {nbr: '{{list[2]}}', nbr_int: '{{list[3]}}'} 
{%     elif new_node == curr_node %} 
      {{list[1]}}: {nbr: '{{list[2]}}', nbr_int: '{{list[3]}}'}
{%    endif %}
{%  set curr_node = new_node %}   
{%  endif %}
{% endfor %}