Nornir小试牛刀

一、Nornir简介

Nornir小试牛刀_第1张图片

        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小试牛刀_第2张图片

      上述是初始化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)整体目录结构

Nornir小试牛刀_第3张图片

四、简单开始

 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

Nornir小试牛刀_第4张图片

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)

#打印输出

Nornir小试牛刀_第5张图片

        另外除了netmiko_send_command外,我们还可以在nornir里面使用netmiko_send_config, netmiko_file_transfer, netmiko_save_config等函数,如下:

五、小试牛刀,统计所有交换机UP端口数

        由于领导让统计交换机下所有端口up情况,计算平台up数,用于未来收费依据使用,所以代码如下:

         vim hosts.yaml       #建好主机清单

Nornir小试牛刀_第6张图片

       vim nornir2.py

Nornir小试牛刀_第7张图片

# 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)

 Nornir小试牛刀_第8张图片

你可能感兴趣的:(NetDevops,python,网络)