我试图收集网络设备数据使用ansible和添加到csv文件,这是为我工作的罚款,但现在我想有标题匹配到什么被收集.
- name: Playbook to collect ntp,snmp_facts and put into csv file
hosts: all
connection: network_cli
gather_facts: true
# check_mode: yes
vars:
output_path: "./reports/"
filename: "device_report_{{ date }}.csv"
vendor: CISCO
tasks:
- name: CSV - Generate output filename
set_fact: date="{{lookup('pipe','date +%Y%m%d')}}"
run_once: true
- name: CSV - Create file and set the header
lineinfile:
dest: "{{ output_path }}/{{ filename }}"
**line: hostname,ip_address,image,iostype,model,serialnum,system,version,ntp_server_1,ntp_server_2,vrf,snmp_server_1,snmp_server_2,snmp_server_3,snmp_server_4,snmp_server_5,snmp_server_6**
create: true
state: present
- import_tasks: /path/playbooks/facts/ntp_facts/ntp_facts_get.yml
# - import_tasks: /path/playbooks/facts/snmp_facts/snmp_facts_get_2960.yml
# - import_tasks: /path/playbooks/facts/snmp_facts/snmp_facts_get_not_2960.yml
- import_tasks: /path/playbooks/facts/snmp_facts/snmp_another_test.yml
- import_tasks: /path/playbooks/facts/dns_facts/dns_facts_domain_name_get.yml
- name: CSV - Getting all the data just before printing to csv
set_fact:
csv_tmp: >
{{ ansible_net_hostname|default('N/A') }},
{{ ansible_host|default('N/A') }},
{{ ansible_net_image|default('N/A') }},
{{ ansible_net_iostype|default('N/A') }},
{{ ansible_net_model|default('N/A') }},
{{ ansible_net_serialnum|default('N/A') }},
{{ ansible_net_system|default('N/A') }},
{{ ansible_net_version|default('N/A') }},
{{ ntp_servers.gathered.servers[0].server|default('N/A') }},
{{ ntp_servers.gathered.servers[1].server|default('N/A') }},
{{ ntp_servers.gathered.servers[0].vrf|default('N/A') }},
{% set snmp_list = [] %}
{% for snmp_host in snmp_hosts %}
{% set snmp_list = snmp_list.append(snmp_host.host ~ ',' ~ snmp_host.version) %}
{% endfor %}
{{ snmp_list|join(',') }},
{{ domain_name[0]|default('N/A') }},
- name: check whats up with this csv_tmp
debug:
var: csv_tmp
- name: CSV - Write information into .csv file
lineinfile:
insertafter: EOF
dest: "{{ output_path }}/{{ filename }}"
line: "{{ csv_tmp }}"
- name: CSV - Blank lines removal
lineinfile:
path: "./{{ output_path }}/{{ filename }}"
state: absent
regex: '^\s*$'
当使用csv_tmp为每个设备附加时,我为snmp设置了for循环
{% for snmp_host in snmp_hosts %}
{% set snmp_list = snmp_list.append(snmp_host.host ~ ',' ~ snmp_host.version) %}
{% endfor %}
{{ snmp_list|join(',') }},
因此,我不知道配置了多少SNMP主机,所以我在想是否有一些更好的方法来实现这一点,或者有一个动态选项来生成报头,或者有一个选项来确保每个值{{ ansible_net_hostname|default('N/A') }},
首先成为某些指定的值,然后删除任何空列。
我有一点时间限制,所以在这里寻求帮助。
1条答案
按热度按时间6l7fqoea1#
给定测试清单
首先创建字典。在 * vars * 中声明以下变量。例如,在 * group_vars * 中
在没有收集任何事实的情况下,
写入文件
给予
创建或收集事实。例如,创建 * host_vars * 以进行测试
问:***"由于某些主机配置了5个SNMP,而某些主机仅配置了2个,因此每次都会覆盖。"***
答:如果您将报告写入远程主机上的单独文件中,则不会发生这种情况。将小时-分钟-秒
%H-%M-%S
添加到CSV文件的名称中然后,每次运行行动手册时都会创建一个新文件。例如,
将创建两个文件
下一个选项是将所有文件写入控制器(localhost)。
并写入文件
然后,每次运行行动手册时,都会在控制器上创建新文件
您可以轻松地从控制器的文件中读取报告。例如,将CSV文件
阅读文件
声明以下变量
Give
一个22块一个
用于在控制器上读取报告的完整行动手册示例