JorgeRaggs
JorgeRaggs

Reputation: 3

Read and use values from csv file

I'm struggling to find a solution for LAB project I'm working on right now. I'd like to use csv file to populate variables in my playbook when configuring Cisco ACI. I'm using read_csv module and the latest Ansible 2.9

Sample CSV:
tenant1;tenant1-vrf;tenant1-app
tenant1;tenant1-vrf2;tenant1-app2
tenant2;;tenant2-vrf2;tenant2-app2

UPDATE - based on Sai's code I'm not far from reaching the objective. This is the full tasks code.
UPDATE2 - eventually I went back to the read_csv module. It works nice even for complex things. Hope it helps someone as an example.

  tasks:
    - name: Read tenant from CSV file and return a list
      read_csv:
        path: "{{ filename }}"
        delimiter: ;
      register: tenantconfig

    - name: TASK 1 - BUILD tenant
      aci_tenant:
        <<: *aci_login
        validate_certs: no
        use_ssl: yes
        tenant: "{{ item.tenant }}"
        description: "{{ item.tenant }} creation as per {{ filename }} source file"
        state: present
      with_items: "{{ tenantconfig.list }}"

    - name: TASK 2 - BUILD Routing {{ vrf }} for {{ tenant }} on {{ apic_host }}
      aci_vrf:
        <<: *aci_login
        state: present
        validate_certs: no
        use_ssl: yes
        tenant: "{{ item.tenant }}"
        vrf: "{{ item.vrf }}"
        description: "{{ item.vrf }}"
      with_items: "{{ tenantconfig.list }}"

Upvotes: 0

Views: 1397

Answers (1)

Sai
Sai

Reputation: 166

i have changed answer to dynamically process your input file and assign tenant,vrf fields where ever you want to call.

tasks:

    - name: split fields
      command: /usr/bin/awk -F';' '!/^#/ && !/^$/ { print $1 }' tenant1.csv
      register: tenants_out

    #- debug:
    #    msg: "{{ lookup('csvfile', item + ' file=tenant1.csv delimiter=; col=0') }}"
    #  with_items: "{{ tenants_out.stdout_lines }}"

    - name: TASK 1 - BUILD tenant
      aci_tenant:
          state: present
          tenant: "{{ lookup('csvfile', item + ' file=tenant1.csv delimiter=; col=0') }}"
          vrf: "{{ lookup('csvfile', item + ' file=tenant1.csv delimiter=; col=1') }}"
      with_items: "{{ tenants_out.stdout_lines }}"

input file lines are spitted using initial task, and you can direct specify required tenent, vrf values using "with_items" looping. this is useful if your input file has multiple lines as well.

Upvotes: 1

Related Questions