我正试图用以下Ansible剧本创建一个csv文件:
- 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.csv999.999.999.8;114;MEF114-999-SS1999;foc19999;N2K-B22HP-P;SS1-99-12;CZ3。。。。;Eth1/13
我预计至少有6行。不知道该怎么办,当我进行调试时,我会得到6行消息。因此,循环正在工作。
我也尝试过Template的方法,但一直坚持在Jinja2上使用子元素进行循环。我不知道怎么做。
如果有人能为我指明正确的方向,我将不胜感激。
许多Thnaks
我认为这里有几个问题。我不确定fex_conf
是否包含了您认为的功能。SHOW FEX By ID
任务正在通过包含fex_list.response
中项目的循环运行。在每次传递时,它都会注册变量fex_conf
。更具体地说,它在每次通过时覆盖fex_conf
的内容
添加此任务以确认怀疑:
- debug:
var: fex_conf
然后使用copy命令,同时向它传递一个循环,这个循环也会遇到同样的问题。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
参数为循环变量设置自定义名称,否则默认为item
。如果不这样做,当包含的文件本身包含循环时,可能会导致奇怪的问题。
lineinfile
只是向文件中添加一行新行,因此向其传递循环是安全的,因为它不会覆盖现有内容。create: yes
确保如果lineinfile在第一次通过时不存在,它将创建一个空白文件
其他人可能会发布更清洁的解决方案,但希望这足以让你行动起来。