Nornir自动化简单介绍-网络设备信息收集

作为网工,学会通过执行脚本,可以自动化的完成日常一些设备相关配置或信息收集等工作,可以说是事半功倍。

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
  • config.yaml

定义了基本工作时需要的相关配置

默认支持并发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.yaml

如下,关于一个设备的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
  • groups.yaml
---
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

如下是,写入excel的内容
在这里插入图片描述

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

你可能感兴趣的:(python)