网络自动化运维 Help

10-1 Nornir自动化工具

介绍

诞生于2018年,对标Ansible,也是一款网络自动化管理工具。
Nornir是netmiko库的高级封装,支持netmiko库支持的各厂商设备。
更偏编程侧、更灵活、>1000台被管理设备时更高性能。
不依赖伪语言,更容易排查错误。

特性

Ansible

Nornir

主要用途

配置管理、应用程序部署、任务自动化

网络设备管理和配置

连接方式

无代理,使用 SSH 连接

使用自定义连接插件

配置语言

YAML(Playbook)

Python Runbook

模块化

提供大量内置模块

内置模块和用户自定义模块

并发执行

支持串行执行

支持异步并发执行

状态管理

声明式配置,自动计算所需步骤

无内置状态管理,用户需自行管理

学习曲线

相对较低,易于上手

需要 Python 编程知识

社区支持

拥有广泛的社区和丰富的文档

社区较小,但逐渐增长

性 能

较低

大于1000台机器时,性能高出2个数量级

适用场景

大规模基础设施管理、CI/CD 流程

复杂网络环境中的高度自定义自动化任务

官方文档英文

收集日志

实验设计:
被管理节点:Ubuntu,已开启SSH协议。
管理节点:Windows上的Python中的Nornir。
目标,Pycharm中书写代码,调用nornir库和nornir_netmiko库,与服务器建立回话后执行命令收集网卡信息或其它信息。

  1. 启动服务器
    启动准备好的Ubuntu虚拟机,此虚拟机已开启ssh服务和配置用户名。用户名密码zhangsan 111111root 111111
    只需开机,其它操作都在Windows物理机的Pycharm中进行。记录下作为被管理节点的虚拟机的IP。

  2. 安装Nornir及相关包

pip install nornir nornir-netmiko nornir-utils -i https://mirrors.cloud.tencent.com/pypi/simple
  1. 项目根目录下创建1个主配置文件、1个子文件夹下含3个子配置文件、1个py脚本,先创建空文件

    10 1

  2. 配置文件

    1. 主配置文件config.yaml ,资产部分又指向几个子配置文件(路径根据实际情况调整)

    --- inventory: plugin: SimpleInventory options: host_file: "inventory/hosts.yaml" group_file: "inventory/groups.yaml" defaults_file: "inventory/defaults.yaml"
    1. 资产默认配置文件inventory/defaults.yaml ,存放公共参数如过一些机器公用相同的用户名密码之类的,这里没有公共内容所以空白

    ---
    1. 资产用户组配置文件inventory/groups.yaml ,存放一些机器公用的参数如用户米密码之类的,这里只书写了用户组名mygroup1和组下包含的主机linux1 (组名和包含的主机名应该与hosts.yaml配置文件中的内容相匹配)

    mygroup1: hosts: linux1 platform: linux
    1. 资产主机配置文件inventory/hosts.yaml ,被管理主机的信息都在这儿(确保IP、用户明、密码与实际情况一致,可以先用powershell中的ssh root@172.31.3.100验证。)

    linux1: hostname: <替换为被管理节点的IP> # 替换为你的被管理节点的ip,这里用的是Ubuntu虚拟机桥接IP。 port: 22 username: root # 被管理节点的ssh用户名密码根据实际情况调整。 password: "111111" # 正规情况下,字符串在yaml格式中都应该用引号,但是为了方便省略了,但这里密码要传递字符串不加引号类型为数字导致报错。 platform: linux groups: - mygroup1 data: type: linux-server os: ubuntu os-ver: "24.04" owner: zhangsan
    10 1
  3. py脚本a.py ,包含引入nornir、实例化、执行任务、打印结果。

    from nornir import InitNornir from nornir_netmiko.tasks import netmiko_send_config, netmiko_save_config, netmiko_send_command from nornir_utils.plugins.functions import print_result # 定义一个任务 def my_task(tasks): results = tasks.run(task=netmiko_send_command, command_string='ip addr') # print(results) # 聚合结果,框架自己封装的一种格式,除了返回信息还有一些其它值,debug可以看到。 return results # 初始化 Nornir nr = InitNornir(config_file='./config.yaml') tasks = nr.filter() # 过滤后的主机,变量名叫filtered_hosts更恰当,但是后面的形参名叫task于是这里起名tasks results = tasks.run(task=my_task) # 返回结果是一个自封装对象,从pycharm debug模式观察返回值的结构 # print(results[0].result) print_result(results)
  4. 结果,得到服务器ip信息,nornir将执行结果过程日志默认保存在与脚本同级目录下

    10 1
    10 1

练习

  1. linux服务器桌面/所有应用 搜索log可以打开系统自带的日志收集图形化工具。这些日志实际来源于/var/log/等目录下的文件,例如tail -50 /var/log/syslog可以获取最近50行的系统日志。 在上面的python代码中再加一个任务用于获取被管理侧的系统日志。

    10 1

  2. (课外)尝试用flask框架做一个类似上面的图形化程序,在表单中输入ip地址,可以获得被管理侧的日志。

  3. 仿照课本,尝试以Huawei CE12800作为被管理侧进行实验。

19 五月 2025