作为网工,学会通过执行脚本,可以自动化的完成日常一些设备相关配置或信息收集等工作,可以说是事半功倍。
Nornir就是这样一个自动化网络运维工具。按照官网上的说明:
Nornir是用python编写的自动化框架,可与python一起使用。Nornir旨在通过提供一个纯Python框架来解决这些问题。
详细参考:
Github
GitHub - nornir-automation/nornir: Pluggable multi-threaded framework with inventory management to help operate collections of devices
官网
Welcome to nornir’s documentation! — nornir 3.0.0 documentation
插件介绍
Nornir Plugins :: nornir.tech — News and information about nornir’s projects
简单说,Nornir类似于Flask,具有模块化的特性,可以选择性的接入各种功能,其中比较贴近网络运维场景的就有Netmiko插件,熟悉的都知道,Netmiko本身就是一个适用于进行网络远程登录管理的python模块,而Nornir继承了其特性,甚至更发扬光大了。
在网络运维中,比较常见的工作,都有设备备份,设备配置,以及设备CMDB管理。
Nornir具备如下目录结构:
├── config.yaml
├── inventory
│ ├── defaults.yaml
│ ├── groups.yaml
│ └── hosts.yaml
├── nornir.log
├── nornir.py
定义了基本工作时需要的相关配置
默认支持并发threaded
---
inventory:
plugin: SimpleInventory
options:
host_file: "inventory/hosts.yaml"
group_file: "inventory/groups.yaml"
defaults_file: "inventory/defaults.yaml"
runner:
plugin: threaded
options:
num_workers: 100
类似Ansible,Nornir也有一个inventory,其中定义了hosts和groups相关信息,以便工作时读取这些文件实现相关功能。
如下,关于一个设备的hosts信息定义,其中platform决定了Nornir自动将设备识别为何种类型,这里指定了"huawei",就是指这是一个网络设备(暂时没有找到H3C对应的类型),而如果是一个linux服务器,就是指定为" platform: linux"。
---
h3c_sw:
hostname: 10.x.x.x
port: 22
username: xxx
password: xxxx
platform: huawei
group:
- Network_Device
data:
cmds:
- display device manuinfo | in NUMBER
---
Network_Device:
data:
- h3c_ac
还有一点,Nornir天然在底层自动实现了设备的批量操作执行,也就是说无需在脚本中引入for循环和threading并发了,只要在hosts.yaml内定义多台网络设备即可。
以下只以相同厂商和型号的设备为例子,实际不同厂商和型号,如果是Nornir支持的情况下也可以实现的。
限于个人能力有限,这里只简单介绍一下单一网络设备信息收集的实现。
如下,简单实现了一个收集h3c网络设备SN号的脚本,通过nornir_netmiko插件中netmiko_send_command模块,来发送执行网络命令,进而对获取的结果进行处理,print_result模块用于输出格式化的结果内容,并最后写入到excel文件。
注意:这里h3c设备的系统版本为V5,执行获取SN号的命令可能会因版本区别而不同。
from nornir import InitNornir
from nornir_utils.plugins.functions import print_result
from nornir_netmiko import netmiko_send_command
import pandas
#加载config,创建一个nornir对象
nr = InitNornir(config_file="config.yaml")
outputs = []
sn_tables = []
def show_cmds(task):
#Task类通过host属性,读取yaml配置,获取其中设备信息
cmds = task.host.data['cmds']
for cmd in cmds:
print(cmd)
#Task类调用run方法,执行任务,如netmiko_send_command、write_file等插件
result = task.run(netmiko_send_command, command_string=cmd)
output = result.result
sn_number = (f'{output}'.replace(' ','@')).split('@')[-1]
hostname = f'{task.host.hostname}'
print(hostname+' '+'SN '+sn_number)
outputs.append(output)
sn_table = [hostname,sn_number]
sn_tables.append(sn_table)
return outputs
results = nr.run(task=show_cmds)
print_result(results)
columns = ['hostname','SN号']
tables = pandas.DataFrame(sn_tables, columns=columns)
namestr = 'host_sn.xlsx'
tables.to_excel(namestr, index=0)
print('{name} created!'.format(name=namestr))
如下,为脚本输出的内容:
D:/pythonscript/net-auto/nr.py
display device manuinfo | in NUMBER
10.x.x.x SN 210235Axxxxxxxxxxxx
show_cmds***********************************************************************
* h3c_ac ** changed : False ****************************************************
vvvv show_cmds ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO
['DEVICE_SERIAL_NUMBER : 210235Axxxxxxxxxxxx']
---- netmiko_send_command ** changed : False ----------------------------------- INFO
DEVICE_SERIAL_NUMBER : 210235Axxxxxxxxxxxx
^^^^ END show_cmds ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
host_sn.xlsx created!
Process finished with exit code 0
Nornir支持的网络设备类型,可以看到如下有很多国外的主流厂商,也有国内比较熟悉的几个厂商。
supported platforms are:
a10
accedian
adtran_os
alcatel_aos
alcatel_sros
apresia_aeos
arista_eos
aruba_os
aruba_osswitch
aruba_procurve
avaya_ers
avaya_vsp
broadcom_icos
brocade_fastiron
brocade_netiron
brocade_nos
brocade_vdx
brocade_vyos
calix_b6
centec_os
checkpoint_gaia
ciena_saos
cisco_asa
cisco_ftd
cisco_ios
cisco_nxos
cisco_s300
cisco_tp
cisco_wlc
cisco_xe
cisco_xr
cloudgenix_ion
coriant
dell_dnos9
dell_force10
dell_isilon
dell_os10
dell_os6
dell_os9
dell_powerconnect
dlink_ds
eltex
eltex_esr
endace
enterasys
extreme
extreme_ers
extreme_exos
extreme_netiron
extreme_nos
extreme_slx
extreme_vdx
extreme_vsp
extreme_wing
f5_linux
f5_ltm
f5_tmsh
flexvnf
fortinet
generic
generic_termserver
hp_comware
hp_procurve
huawei
huawei_olt
huawei_smartax
huawei_vrpv8
ipinfusion_ocnos
juniper
juniper_junos
juniper_screenos
keymile
keymile_nos
linux
mellanox
mellanox_mlnxos
mikrotik_routeros
mikrotik_switchos
mrv_lx
mrv_optiswitch
netapp_cdot
netgear_prosafe
netscaler
nokia_sros
oneaccess_oneos
ovs_linux
paloalto_panos
pluribus
quanta_mesh
rad_etx
raisecom_roap
ruckus_fastiron
ruijie_os
sixwind_os
sophos_sfos
tplink_jetstream
ubiquiti_edge
ubiquiti_edgerouter
ubiquiti_edgeswitch
ubiquiti_unifiswitch
vyatta_vyos
vyos
watchguard_fireware
yamaha
zte_zxros