Nornir是用python编写的自动化框架,可与python一起使用。相比另一个自动化大杀器ansible来讲,nornir操作更加的灵活,不受格式限制,于python结合可灵活操作,最最重要的是并发性完全秒杀ansible,但这不是说ansible一无是处,ansible依然强大,基础群众庞大,而nornir更适合操作网络设备。
Nornir旨在通过提供一个纯Python框架来解决这些问题。只需将Nornir想象成自动化的烧瓶。Nornir将负责处理您拥有主机信息的清单,它将负责将任务分派到您的设备,并将提供编写“插件”的通用框架。
Nornir要求安装Python 3.6.2或更高版本。
1)笔者建议使用vmware虚拟机安装一台centos7或8,详细的系统安装不在此说了,网上很多。
2)检查python版本,python --version,下载python3
可以访问python的官方网站查看最新的python版本以及下载链接:https://www.python.org/downloads/,将鼠标移到想要官网上想要下载的版本号上就可以看到下载地址,例如我需要在Linux下安装,可以使用这个链接:https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tgz(如果想要下载其他版本,直接修改版本号即可)。
找到下载地址后,在命令行输入:
# wget https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tgz
3)下载完成后解压缩
# tar -zxvf Python-3.8.5.tgz
进入解压缩后的目录,安装配置:
# cd Python-3.8.5/
# ./configure
执行 ./configure 时,如果报错:
configure: error: no acceptable C compiler found in $PATH
说明没有安装合适的编译器。这时,需要安装/升级 gcc 及其它依赖包。
# sudo apt-get install make gcc gcc-c++
完成之后,重新执行:
# ./configure
配置完成之后,就可以编译了:
# make
编译完成后,进行安装(安装时有的可能会因为权限问题报错,可以加上sudo):
# sudo make install
4)验证
安装成功以后,就可以查看 Python 的版本了:
# python -V
Python 2.7.5
# python3 -V
Python 3.8.5
5)pip3安装
安装方法:https://blog.csdn.net/qq_21153619/article/details/84635002
手动安装:
手动安装:
wget --no-check-certificate https://pypi.python.org/packages/source/p/pip/pip-9.0.1.tar.gz#md5=3a73c4188f8dbad6a1e6f6d44d117eeb
tar -zxvf pip-9.0.1.tar.gz
cd pip-9.0.1
python3 setup.py build
python3 setup.py install
6)安装nornir
pip3 install nornir
7)验证
8)关于插件
2.4 2.5的时候,很多东西都是内置的,但是3.0版本发生了很大的变化,官方把一些插件,分拆了出去,nornir变得更加纯粹了。比如以前的时候nornir支持netmiko和napalm等,现在统统分拆出去了,创建了新工具包,比如nornir_napalm就是nornir的一个对napalm封装,同样的也有nornir_netmiko,很多很多工具包都被这样分解出去了。有点像flask,它只提供最基础的web开发框架,如果想实现一些admin后台或者表单相关的,需要安装对应的flask工具包。
nornir的官方网站是https://nornir.tech/ 在https://nornir.tech/nornir/plugins/ 我们可以看到官方的插件list,插件list分成几种:任务类的、连接类的、资源管理类的、进程管理、函数功能等等,比如netmiko就是一个任务类和连接类的插件包
上述是初始化nornir最简单使用方法,使用函数InitNornir,配置文件。
1)inventory:清单
主机清单,并没有一个特别准确事实标准的翻译,大家公认的叫法是这样。一个自动化框架里,或大或小,都需要有一个类似的设备管理模块,记录了我们维护的设备、型号、厂商、IP、用户名等等,在处理自动化的时候,通过设备名或者IP地址来对设备进行批量配置。
Nornir也有一个inventory的模块,它是有hosts(主机)、groups(组)和defaults(默认值)三部分组成,这三个概念的抽象以及用法的灵活,使nornir的设备清单管理异常强大,与网络的一些场景异常契合,简直秒杀ansible或者是其他的一些web自动化的框架。
2)plugin: SimpleInventory:官方默认的SimpleInventory加载
Nornir加载出设备清单,需要用到一个inventory的plugin类,它主要就是实现一个返回Inventory对象的功能load。Inventory就是由hosts、groups、defaults三个变量进行初始化的一个类。
3)options:指明变量及存在目录
Nornir内置了一个简单的主机清单类,它的方法是通过指定三个yaml文件(host_file group_file defaults_file),加载hosts、groups、defaults三个变量,然后返回一个Inventory类,进而实现设备的管理和灵活筛选,以及连接(ssh netconf等等)的建立。
4)runner:运行及并发
指定运行的方式threaded,比如默认的线程及并发量100,这个可以按设备性能自行更改。
5)整体目录结构
1)在当前创建一个目录nornir
mkdir nornir
2)进入目录创建一个config.yaml配置文件
---
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
3)创建一个目录inventory
mkdir inventory
cd inventory
vim hosts.yaml #编辑主机清单,我习惯不在主机内写太多东西,因为交换机比较多,很多只写一次全部放在另外两个变量内了
---
sw1: # 主机名称,执行的时候抬头会显示
hostname: 192.168.0.1 #主机地址
groups: #组,关联组yaml内的switch这个变量
- switch
vim groups.yaml
---
switch:
platform: huawei #设置平台类型,兼容netmiko和napalm
data: #设备的自定义相关参数变量,我这里用来标注位置及设备型号
site: Core #方便日后过滤使用
role: S5720
vim defaults.yaml #这里我存放了用户名与密码
---
username: admin
password: admin123
4)返回nornir目录,创建nornir1.py脚本
vim nornir1.py
from nornir import InitNornir.
#从nornir中导入InitNornir子类,InitNornir的作用是用来初始化nornir,是nornir下面最重要的一个子类。
from nornir_netmiko import netmiko_send_command
#从nornir中导入netmiko,用于执行下发交换机命令
from nornir_utils.plugins.functions import print_result
#调用nornir_utils.plugins.functions中的print_result来将我们得到的设备信息打印出来。
nr = InitNornir(config_file="config.yaml")
#使用InitNornir()函数来初始化设备并将它赋值给变量nr。InitNonir()函数中需要放入config_file这个参数,针对这个参数这里我们使用的是前面提到的config.yaml这个文件, 后面的dry_run参数在调用nornir_napalm时必须设为True。
results = nr.run(netmiko_send_command, command_string='dis version')
#用netmiko的send_command函数向SW1和SW2执行display version 命令。
print_result(results)
#打印输出
另外除了netmiko_send_command外,我们还可以在nornir里面使用netmiko_send_config, netmiko_file_transfer, netmiko_save_config等函数,如下:
由于领导让统计交换机下所有端口up情况,计算平台up数,用于未来收费依据使用,所以代码如下:
vim hosts.yaml #建好主机清单
vim nornir2.py
# coding=utf-8 #当有中文时,指定编码格式
from nornir import InitNornir
from nornir_netmiko import netmiko_send_command
from nornir_utils.plugins.functions import print_result
from nornir.core.task import Task, Result #使用task函数
import re #导入正则表达式
nr = InitNornir(config_file="config.yaml")
uplists = [] #建一个空列表
def backup(task:Task) -> Result: #设置自定义函数
cmds = ['dis int br | in up'] #命令列表
max_loops = 180/0.2 #设定最大超时时间
for cmd in cmds: #循环输入命令
result = task.run(netmiko_send_command, command_string=cmd, max_loops=max_loops)
output = result.result #output对应result输出
up = re.findall(r'GigabitEthernet', output) #正则表达式过滤Gi接口
counter = up.count('GigabitEthernet') #计算gi数传输给counter
print('当前交换机UP端口数:', counter)
uplists.append(counter) #循环计算出端口数之后向列表内添加
results = nr.run(task=backup)
sum = 0 #循环相加所有端口数
for i in uplists:
sum += i
print('交换机UP总数是:', sum)