Попытка создать файл.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 создаст пустой файл, если он не существует на первом проходе.
Возможно, есть более чистые решения, которые другие опубликуют, но, надеюсь, этого будет достаточно, чтобы вы переехали.