Читать и использовать значения из CSV-файла - PullRequest
0 голосов
/ 07 ноября 2019

Я изо всех сил пытаюсь найти решение для проекта 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

UPDATE - основываясь на коде Саи, я не далеко от достижения цели. Это полный код задачи.

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

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

    - set_fact:
        tenant: "{{ lookup('csvfile', item + ' file={{ filename }} delimiter=; col=0') }}"
        vrf: "{{ lookup('csvfile', item + ' file={{ filename }} delimiter=; col=1') }}"
      with_items: "{{ tenants_out.stdout_lines }}"


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

    - name: TASK 2 - BUILD Routing "{{ vrf }}" for "{{ tenant }}"
      aci_vrf:
        <<: *aci_login
        state: present
        validate_certs: no
        use_ssl: yes
        tenant: "{{ tenant }}"
        vrf: "{{ vrf }}"
        policy_control_preference: unenforced
        description: "{{ vrf }}"

Одна проблема все еще остается, и это некоторая неправильная конфигурация в разделе цикла. Отладка показывает, что значения из csv неправильно назначены переменной во втором (и дальнейшем) цикле.

ok: [apic] => (item=tenant1) => {
    "msg": "tenant1-vrf"
}
ok: [apic] => (item=tenant1) => {
    "msg": "tenant1-vrf"
}
ok: [apic] => (item=tenant2) => {
    "msg": ""
}

Кто-нибудь может увидеть, что я здесь делаю неправильно, пожалуйста? Я пробовал это с двумя циклами (один для set_fact, второй для использования этих переменных), но я все еще видел в сообщении отладки, что скрипт читает только первую строку csv.

Спасибо за любую помощь,

1 Ответ

0 голосов
/ 07 ноября 2019

Я изменил ответ, чтобы динамически обработать ваш входной файл и назначить поля tenant, 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. это полезно, если ваш входной файл имеет несколько строк.

...