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库,与服务器建立回话后执行命令收集网卡信息或其它信息。
启动服务器
启动准备好的Ubuntu虚拟机,此虚拟机已开启ssh服务和配置用户名。用户名密码zhangsan 111111、 root 111111。
只需开机,其它操作都在Windows物理机的Pycharm中进行。记录下作为被管理节点的虚拟机的IP。安装Nornir及相关包
项目根目录下创建1个主配置文件、1个子文件夹下含3个子配置文件、1个py脚本,先创建空文件

配置文件
主配置文件config.yaml ,资产部分又指向几个子配置文件(路径根据实际情况调整)
--- inventory: plugin: SimpleInventory options: host_file: "inventory/hosts.yaml" group_file: "inventory/groups.yaml" defaults_file: "inventory/defaults.yaml"资产默认配置文件inventory/defaults.yaml ,存放公共参数如过一些机器公用相同的用户名密码之类的,这里没有公共内容所以空白
---资产用户组配置文件inventory/groups.yaml ,存放一些机器公用的参数如用户米密码之类的,这里只书写了用户组名mygroup1和组下包含的主机linux1 (组名和包含的主机名应该与hosts.yaml配置文件中的内容相匹配)
mygroup1: hosts: linux1 platform: linux资产主机配置文件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
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)结果,得到服务器ip信息,nornir将执行结果过程日志默认保存在与脚本同级目录下


练习
linux服务器桌面/所有应用 搜索log可以打开系统自带的日志收集图形化工具。这些日志实际来源于/var/log/等目录下的文件,例如
tail -50 /var/log/syslog可以获取最近50行的系统日志。 在上面的python代码中再加一个任务用于获取被管理侧的系统日志。
(课外)尝试用flask框架做一个类似上面的图形化程序,在表单中输入ip地址,可以获得被管理侧的日志。
仿照课本,尝试以Huawei CE12800作为被管理侧进行实验。