Чтение и использование значений из CSV-файла

Я изо всех сил пытаюсь найти решение для проекта LAB, над которым я сейчас работаю. Я хотел бы использовать CSV-файл для заполнения переменных в моей книге воспроизведения при настройке Cisco ACI. Я использую модуль read_csv и последнюю версию Ansible 2.9.

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

ОБНОВЛЕНИЕ. Судя по коду Сая, я недалек от достижения цели. Это полный код задач.
UPDATE2 — в конце концов я вернулся к модулю read_csv. Это работает хорошо даже для сложных вещей. Надеюсь, это поможет кому-то в качестве примера.

  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 }}"

person JorgeRaggs    schedule 07.11.2019    source источник


Ответы (1)


я изменил ответ, чтобы динамически обрабатывать ваш входной файл и назначать поля арендатора, vrf, где бы вы ни хотели звонить.

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 }}"

строки входного файла разбиваются с помощью исходной задачи, и вы можете напрямую указать требуемые значения tenent, vrf, используя цикл with_items. это полезно, если ваш входной файл также содержит несколько строк.

person Sai    schedule 07.11.2019
comment
Спасибо! Мне это нравится! (Не могу голосовать, если у меня нет репутации › 15), но это работает только до некоторой степени. Я играл с подобным решением раньше. Однако мне понадобится playbook для динамического получения значений из файла csv. Таким образом, мне пришлось бы определить «Tenant1» и все профили либо здесь, либо с помощью дополнительных переменных в оболочке. Я хотел бы, чтобы игра считывала значения и использовала их без моего вмешательства. Например, в стиле dict или list. Вы можете придумать что-нибудь подобное? Можно ли это сделать через set_fact с циклами? - person JorgeRaggs; 08.11.2019
comment
я изменил ответ таким образом, чтобы входной файл (даже с несколькими строками) обрабатывался без указания имени столбца/поля внутри файла yml. - person Sai; 10.11.2019
comment
Спасибо, Сай! Почти там, почти там! Я экспериментировал в течение последних двух дней, мне удалось сделать его более общим. Я все еще сталкиваюсь с той же проблемой - как скрипт может проходить строки в CSV, использовать эти ячейки в качестве переменных. Думаю, это отличная альтернатива модулю read_csv (если он заработает). - person JorgeRaggs; 12.11.2019