使用CSV文件的输入从Jinja模板创建文本文件

时间:2019-08-30 04:57:51

标签: ansible jinja2

我正在尝试创建一个文本文件,该文本文件将通过CSV文件并将变量填充到特定字段中。 playbook.yml:

   - hosts: localhost
  tasks:
    - name: "Reading user information"
      read_csv:
        path: /home/test/vlans.csv
        delimiter: ','
      register: vlans
    - debug: var=vlans
    - name: Creating VLANs configuration
      template:
        src: vlan.conf.j2
        dest: /tmp/vlan.conf

Jinja2模板vlan.conf.j2:

{% for item in vlans %}
!
vlan {{ item.VLAN }}
    name {{ item.Description }}
            vn-segment {{ item.VNI }}



interface nve1
   member vni {{ item.VNI }}


 {% endfor %}  

这是一个测试vlans.csv文件:

Tenant,VRF ,VLAN,VNI,Subnet,Description,Good to go
Test,,5,20005,,LAB-Checkpoint-FW-Mgmt,Yes
Test,,208,20208,,LAB-DMZ,Yes Test,,209,20209,,LAB-CSR-MGMT,Yes
Test,10000,210,20210,192.168.12.1/28,LAB-VRF-to-FW,Yes
Prod,,761,20761,,PROD-CORE,Yes
Prod,105,840,20840,172.18.33.1/24,Backups,Yes
Prod,,841,20841,,Transport,Yes

我想以jinja2模板中的文件结尾,而不要重复行“ interface nve 1”

1 个答案:

答案 0 :(得分:0)

在您的问题中,interface nve1在循环内。它将在生成的vlan.conf文件中重复多次。

在Jinja模板中使用多个循环来确定重复的内容和不重复的内容:

{% for item in vlans.list %}
vlan {{ item.VLAN }}
    name {{ item.Description }}
    vn-segment {{ item.VNI }}

{% endfor %}

interface nve1
{% for item in vlans.list %}
   member vni {{ item.VNI }}
{% endfor %}

请注意,我在循环开始时是指vlans.list,而不是vlans。根据{{​​3}},这是正确的,但与问题中的示例不同,因此可能需要进行调整。