Попытка создать файл.csv с модулем Ansbile Copy, опцией содержимого, но записывает только последнюю итерацию цикла

Я пытаюсь создать CSV-файл со следующей Ansible playbook:


  - name: Find Fex Enclosure
    hosts: MAQ
    gather_facts: no
    connection: local

    tasks:


      - name: GET VENDOR & OS OF THE EQUIPEMENT
        snmp_device_version:
          host={{ inventory_hostname }}
          version=3
          integrity=xxxx
          level=authPriv
          privacy=xxxx
          username=xxxxxx
          authkey=xxxxxxx
          privkey=xxxxxxx

      - name: SHOW FEX
        ntc_show_command:
          connection=netmiko_ssh
          platform={{ ansible_device_vendor }}_{{ ansible_device_os }}
          command='show fex'
          host={{ inventory_hostname }}
          username={{ ansible_user }}
          password={{ ansible_pass }}
          template_dir=/usr/share/ansible/plugins/modules/ntc-ansible/ntc-templates/templates/
        register: fex_list


      - name: SHOW FEX By ID
        ntc_show_command:
          connection=netmiko_ssh
          platform={{ ansible_device_vendor }}_{{ ansible_device_os }}
          command='show fex {{ item.number }}'
          host={{ inventory_hostname }}
          username={{ ansible_user }}
          password={{ ansible_pass }}
          template_dir=/usr/share/ansible/plugins/modules/ntc-ansible/ntc-templates/templates/
        register: fex_conf
        with_items: "{{ fex_list.response }}"

      - name: create File.csv with content from fex_conf
        copy: 
          content: "{{ inventory_hostname }};{{ item.1.fex }};{{ item.1.description }};{{ item.1.extender_serial }};{{ item.1.extender_model }};{{ item.1.enclosure }};{{ item.1.enclosure_serial }};{{ item.1.fabric_port }}\n"
          dest: out/file.csv
        loop: "{{ fex_conf.results | subelements('response') }}"
        when: item.1.enclosure !=""

Проблема в том, что он записывает только последнюю итерацию в файл.csv

вот что я получил:

cat out / file.csv 999.999.999.8; 114; MEF114-999-SS1999; FOC199999; N2K-B22HP-P; SS1-999-12; CZ3....; Eth1 / 13

Я ожидаю по крайней мере 6 строк. Не знаю, что делать, когда я делаю отладку, я получаю 6 строк как msg.SO цикл работает.

Я также попробовал способ Template, но застрял в цикле с подэлементами на Jinja2. Я не знаю как это сделать.

Если кто-то может указать мне в правильном направлении, я буду признателен.

Много благодарностей

1 ответ

Я думаю, что здесь есть несколько проблем. Я не уверен что fex_conf содержит то, что вы думаете, что делает. SHOW FEX By ID задача проходит через цикл, содержащий элементы в fex_list.response, На каждом проходе регистрируется переменная fex_conf, Более конкретно, он перезаписывает содержимое fex_confна каждом проходе.

Добавьте эту задачу, чтобы подтвердить это подозрение:

- debug:
    var: fex_conf

Затем вы используете команду копирования, также передавая ей цикл, который также страдает от той же проблемы. Команда copy создает файл в целевом объекте при каждом проходе с текущим содержимым цикла в качестве его содержимого. Это поэтому перезаписывается на каждом проходе.

Одним из возможных решений было бы разделить пару задач на отдельный файл process_fex.yml

---
# process_fex.yml

- name: SHOW FEX By ID
  ntc_show_command:
    connection=netmiko_ssh
    platform={{ ansible_device_vendor }}_{{ ansible_device_os }}
    command='show fex {{ fex_data.number }}'
    host={{ inventory_hostname }}
    username={{ ansible_user }}
    password={{ ansible_pass }}
    template_dir=/usr/share/ansible/plugins/modules/ntc-ansible/ntc-templates/templates/
  register: fex_conf

- name: update File.csv with content from fex_conf
  lineinfile:
    dest: out/file.csv
    line: "{{ inventory_hostname }};{{ item.1.fex }};{{ item.1.description }};{{ item.1.extender_serial }};{{ item.1.extender_model }};{{ item.1.enclosure }};{{ item.1.enclosure_serial }};{{ item.1.fabric_port }}"
    create: yes
  loop: "{{ fex_conf.results | subelements('response') }}"

Затем вы можете включить этот файл и прикрепить вывод SHOW FEX к нему как к петле:

- name: SHOW FEX
  ntc_show_command:
    connection=netmiko_ssh
    platform={{ ansible_device_vendor }}_{{ ansible_device_os }}
    command='show fex'
    host={{ inventory_hostname }}
    username={{ ansible_user }}
    password={{ ansible_pass }}
    template_dir=/usr/share/ansible/plugins/modules/ntc-ansible/ntc-templates/templates/
  register: fex_list

- include: process_fex.yml
  loop: "{{ fex_list }}"
  loop_control:
    loop_var: fex_data

loop_control.loop_var param, устанавливает произвольное имя для переменной цикла, которое по умолчанию имеет значение item, Невыполнение этого требования может привести к странным проблемам, когда сам включенный файл содержит цикл.

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

Возможно, есть более чистые решения, которые другие опубликуют, но, надеюсь, этого будет достаточно, чтобы вы переехали.

Другие вопросы по тегам