网络自动化Python课程:基于Ansible的思科设备网络自动化与排错
📑 知识精讲
本课程介绍了使用Ansible对Cisco网络设备进行自动化配置的基础内容,讲解了Ansible的架构、核心文件、Playbook编写规则、常用模块用法,还分享了实用的排错与开发技巧,帮助学习者快速掌握基于Ansible的思科网络自动化方法。
课程概述与Ansible基础介绍
-
课程目标:讲解Ansible在思科设备自动化中的应用,涵盖架构、核心组件、文件编写和交互方法,包含两个实验练习:配置网络设备与采集网络数据,课程推荐参考Ansible官方在线文档学习。
-
Ansible核心特点:Ansible是无代理(agentless)配置管理工具,可自动化多域环境(园区网、数据中心、云、服务商、虚拟网络)的设备,支持自定义模块适配仅支持Telnet/SNMP的老旧设备。
-
🚩重点:Ansible核心文件均使用YAML语法,必须掌握YAML格式规范。**YAML文件以三个连字符
---开头表示play列表开始**。 -
🚩重点:与传统基于代理的配置工具不同,Ansible默认工作在无代理模式,Python代码在Ansible控制节点本地运行,通过SSH/NETCONF/REST等协议与网络设备通信,不需要将代码复制到目标设备。
Ansible核心组件与文件
-
Ansible配置文件(ansible.cfg):用于声明部署细节,默认路径为
/etc/ansible/ansible.cfg,Ansible按优先级顺序搜索配置文件:1. 当前目录的ansible.cfg;2. 用户home目录的ansible.cfg;3./etc/ansible/ansible.cfg。推荐将配置文件放在项目根目录,实现每个项目独立配置。 -
Ansible Inventory文件(清单文件):定义被Ansible管理的目标设备,默认路径为
/etc/ansible/hosts,如果修改路径或文件名,执行playbook时需要添加-i <文件名>参数指定。推荐也放在项目根目录。-
可以将主机按用途/位置分组,支持嵌套分组,所有设备默认属于隐式分组
all; -
支持INI和YAML两种格式,支持通配符、正则表达式匹配目标;
-
支持定义主机变量和组变量,更具体的变量会覆盖更通用的变量(如
dc_east:vars会覆盖all:vars中同名变量)。
-
-
Ansible Playbook:是自动化任务的集合,一个playbook包含一个或多个play,每个play是一组任务的映射,用于定义目标设备、连接方式和执行任务。
-
语法结构:
name(play名称,执行时显示)→hosts(指定目标设备组)→connection(连接类型,网络设备使用network_cli提供SSH持久连接)→gather_facts(默认开启,网络自动化可设为no提升性能)→tasks(任务列表,顺序执行)。 -
任务属性:通过模块执行,支持参数键值对,每个任务有可选名称便于运行时追踪。
-
-
企业级Ansible:基础Ansible是命令行工具,企业级功能由AWX(开源版)和Ansible Tower(红帽商业版)提供,支持RBAC权限控制、LDAP认证、图形化界面、日志、Git集成、API访问、报表等功能,二者关系类似Fedora和RHEL。
Ansible工作流程
-
服务器自动化工作流程:1. 运维人员在控制节点部署playbook和模块;2. Ansible默认通过SSH连接远程服务器,复制Python模块到目标主机;3. 在目标主机执行模块任务,完成后删除模块,控制节点返回执行状态;4. 循环执行后续任务。
-
网络设备自动化工作流程:和服务器流程的最大区别是Python代码全部在Ansible控制节点本地运行,不会向网络设备复制任何代码,仅通过SSH发送配置命令或获取数据,可同时管理Inventory中定义的多台设备。
Ansible常用思科模块详解
-
ios_config模块:Ansible 2.1版本引入,用于对Cisco IOS设备进行配置修改和配置备份,是最常用的配置模块。
-
常用参数:
commands(别名lines,要发送的配置命令列表)、src(要推送的配置文件路径),commands和src互斥,只能使用其一; -
🚩重点:模块具有幂等性,同一个任务只会修改一次配置,重复执行playbook不会重复修改,如果重复执行仍然发生变更说明模块存在bug或配置逻辑错误;
-
支持从变量文件拉取变量,用
{{ 变量名 }}引用变量,实现配置的动态生成。
-
-
ios_facts模块:用于从思科IOS/IOS-XR/NX-OS设备收集结构化设备信息。
-
支持参数
gather_subset选择收集的事实范围:all收集全部、!hardware排除硬件信息、interfaces仅收集接口信息、min仅收集最小基础信息; -
默认收集所有基础信息,返回结果为JSON格式,所有网络事实键都以
ansible_net_为前缀,可以用register关键字将结果保存为字典变量供后续任务使用; -
需要开启verbose模式或配合
debug模块才能在终端查看收集到的信息。
-
-
ios_command模块:用于在思科IOS设备执行任意用户指定的show命令,将返回结果保存为变量。
-
可以同时发送多个命令,返回结果保存在
stdout列表中,列表从0开始索引,stdout[0]对应第一个命令的输出,stdout[1]对应第二个命令的输出; -
可用于备份设备配置:将获取的配置保存到按设备名+日期命名的文件中,实现自动化配置备份。
-
Playbook执行方法
-
基础执行命令格式:
$ ansible-playbook -i inventory view_push_snmp.yml
参数说明:
-
ansible-playbook:执行playbook的命令行程序 -
-i inventory:指定Inventory文件路径 -
view_push_snmp.yml:要执行的playbook文件
-
不指定
-i的替代方案:1. 使用默认路径/etc/ansible/hosts;2. 配置环境变量ANSIBLE_INVENTORY;3. 在ansible.cfg中修改默认路径。 -
🚩排错技巧:执行playbook时添加
-v参数开启verbose模式,可以逐行显示执行过程,便于定位问题。
Cisco支持的Ansible模块
-
(根据课堂图片)支持Ansible的思科产品线包括:ACI、AireOS、IOS Software、IOS XR Software、Meraki、NSO、NX-OS、UCS、ASA,覆盖园区网、数据中心、云管理、服务商、虚拟网络等多个场景。
-
官方模块可在Ansible在线文档https://docs.ansible.com查询,第三方社区模块可在Ansible Galaxy(https://galaxy.ansible.com)下载安装,第三方模块为社区维护,生产环境使用需要自行验证质量。
Ansible排错与开发技巧
-
Playbook排障技巧:
-
注释隔离法:使用
#注释掉暂时不需要测试的任务,只保留要调试的单个任务,逐步排查问题,适合定位YAML缩进错误、语法错误; -
检查变量拼写:Ansible对变量拼写敏感,单复数拼写错误、关键字拼写错误都会导致找不到变量,需要严格和定义处保持一致;
-
解决变量优先级问题:Ansible变量可保存在多个位置,同名变量遵循优先级规则,调试时可将变量直接写在playbook中,利用playbook变量高优先级的特性排除冲突。
-
-
模板开发技巧:
-
使用TD4A工具可视化调试:该工具分三栏显示变量、模板、渲染结果,点击即可生成最终配置,在推送前验证模板语法,节省重复执行playbook的时间;
-
拆分大模板:将大配置拆分为多个小模板,分别调试后再组合,降低排错难度;
-
善用内置变量:比如
inventory_hostname等内置变量可直接使用,比如用它自动生成备份文件名,减少手动定义变量的工作量。
-
-
YAML缩进问题避免技巧:
-
使用专业开发编辑器:如VS Code、Sublime Text,这类工具可以可视化显示空格/制表符、缩进辅助线,自动统一缩进格式,避免制表符和空格混合使用的问题;
-
不要手动数空格,出错时可重置缩进,重新逐层缩进,保证缩进层级一致。
-
💡 核心概念
-
无代理架构:Ansible是无代理自动化工具,Python代码在控制节点本地运行,不需要在目标网络设备安装代理。
-
幂等性:模块执行一次就会完成变更,重复执行不会重复修改,是配置管理模块的核心特性。
-
Inventory文件:Ansible用来定义目标设备的文件,支持分组、嵌套分组、主机变量、组变量。
-
Playbook:用YAML编写的自动化任务集合,包含一个或多个play,每个play定义目标和执行任务,顺序执行。
-
变量优先级:更具体的变量(如主机变量、play内变量)优先级高于更通用的变量(如all组变量),会覆盖同名变量。
-
执行playbook命令:
ansible-playbook -i <inventory文件> <playbook文件>
✨ 课堂金句
-
"Having this solid conceptual foundation knowledge will allow you to better understand how ansible can be used on a production environment."
-
"Learning is different from when you learn from an expert. And how do you do that? You have to ask them. Ask the experts, everybody."
🎯 课程总结
📌 Ansible基础概述
-
定义:Ansible是一款开源自动化工具,无需在被控设备安装代理(agentless),基于Python开发,通过SSH、NETCONF等协议实现设备管理。
-
核心优势:支持多域环境(园区LAN、数据中心、云、服务提供商、虚拟网络),可替代手动流程,支持自定义模块适配旧设备(如Telnet/SNMP)。
-
配置管理工具类型:代理型(agent-based)需在控制器与设备间运行进程,而Ansible属于无代理型(agentless)。
🔧 Ansible核心组件
-
Ansible配置文件(ansible.cfg):
-
功能:声明部署细节(如SSH设置、权限升级、模块路径)。
-
默认路径:
/etc/ansible/ansible.cfg,支持自定义路径(当前目录→用户主目录→默认路径),推荐存放在项目根目录。
-
-
Ansible清单文件(Inventory):
-
功能:定义被管理设备列表,支持分组和变量。
-
默认路径:
/etc/ansible/hosts,执行时可通过-i参数指定自定义清单。 -
格式示例(INI-like):
[dc_east] csr1kv1 csr1kv2 [dc_west] csr1kv3 csr1kv4 -
变量:支持主机变量(特定设备)和组变量(如
[dc_east:vars]定义组内通用变量),优先级:组变量 > 全局变量。
-
-
Ansible模块(Modules):
-
功能:执行具体任务的代码单元,多数用Python编写,支持幂等性(重复执行不改变结果)。
-
常用Cisco模块:Cisco ACI、AireOS、IOS、IOS XR、Meraki、NSO、NX-OS、UCS、ASA等。
-
-
Ansible剧本(Playbook):
-
功能:用YAML编写的任务序列,定义“剧本(Play)”和“任务(Task)”。
-
结构示例:
--- - name: 部署SNMP配置 hosts: iosxe # 目标设备组(来自清单) connection: network_cli # 网络设备连接方式 gather_facts: no # 关闭事实收集 tasks: - name: 查看SNMP社区 ios_command: commands: show snmp community - name: 配置SNMP社区 ios_config: commands: - snmp-server community public RO - snmp-server community private RW
-
🚀 Ansible工作流程
-
准备阶段:工程师编写Playbook和模块(可通过GitHub管理),定义清单文件。
-
执行阶段:
-
Linux服务器:Ansible通过SSH将Python模块复制到目标服务器执行,完成后删除。
-
网络设备:模块在控制节点本地运行,通过SSH/HTTP/NETCONF发送命令,不复制代码到设备。
-
-
反馈阶段:控制节点显示任务执行状态和返回数据。
💻 企业级应用
-
Ansible AWX:开源项目,提供RBAC、API访问、凭证管理、日志、Git集成和Web界面。
-
Ansible Tower:Red Hat商业版,基于AWX,增加企业级支持(如LDAP认证)。
📝 执行命令与文件要求
-
执行Playbook:
ansible-playbook -i <inventory_file> <playbook_file>,例如:ansible-playbook -i inventory view_push_snmp.yml -
必需文件:清单文件(Inventory)和剧本文件(Playbook)。
🔍 关键考点
-
执行Playbook的命令:
ansible-playbook。 -
无代理工具的特点:无需在被控设备安装软件。
-
模块幂等性:确保重复执行任务结果一致。
📝 待办事项
-
实验任务:1. 使用Ansible配置网络设备;2. 使用Ansible收集网络数据
-
阅读参考:Ansible官方文档 https://docs.ansible.com,第三方模块参考 Ansible Galaxy
-
预习复习:掌握YAML语法,练习编写简单的Ansible Playbook管理思科设备
-
工具准备:安装VS Code/Sublime Text用于编写YAML文件,可试用TD4A模板调试工具
1. 使用Ansible配置网络设备:


























Open Chrome or Firefox and go to https://docs.ansible.com/ansible/9 for the main page. Click Ansible Documentation.
















2. 使用Ansible收集网络数据:









































更多推荐


所有评论(0)