我正在使用ansible将CSV文件转换为YML
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 %}