1. 这不是又一本“照着敲就完事”的Ansible教程网工朋友你点开这篇大概率刚被“自动化运维”四个字按在工位上反复摩擦过——可能是领导甩来一句“下周起配置要自动下发”也可能是面试官突然问“你用Ansible批量改过多少台交换机的SNMP配置”更可能是深夜改完第17版ACL后盯着CRT里一串串重复的copy running-config startup-config发呆这活儿真得手抖着敲200遍我干网工八年前五年靠记忆命令、Excel表格和截图存档活着后三年开始把Ansible当呼吸一样用。不是因为多爱写YAML而是亲眼见过它把一个需要3人盯4小时的割接窗口压缩成2分钟执行5分钟验证。但我也踩过所有你能想到的坑第一次跑playbook时权限报错卡在waiting for privilege escalation prompt查了三小时才发现是sudoers里少了个NOPASSWD用ios_command模块批量抓取设备信息结果200台设备里有17台因固件版本差异返回格式不一致整个任务直接崩掉甚至在生产环境误删了inventory文件导致Ansible把测试交换机当成了核心路由器去执行reboot……这些不是段子是我在客户机房地板上啃着冷包子debug时的真实记录。所以这篇《可能会成为网工Ansible的最强教程一》不讲“Ansible是什么”这种百度前三页都写烂的定义也不堆砌ansible --version这种入门命令。它只解决网工最痛的三个问题第一怎么让Ansible真正听懂网络设备的语言而不是把它当Linux服务器使第二怎么在不搞崩现网的前提下把零散的CLI操作变成可复用、可审计、可回滚的代码第三怎么让这套东西在你明天就要交的割接方案里立刻能写进PPT第一页“自动化保障措施”。关键词里高频出现的“网工面试题”“网工工具”“ansible安装部署”恰恰暴露了当前学习资源的最大断层要么是纯DevOps视角的通用教程满篇docker-compose.yml和K8s集群网工看了像读天书要么是碎片化命令速查告诉你ansible-playbook -i hosts site.yml怎么敲却不解释为什么hosts文件里[core_routers]组必须加ansible_network_os: ios这个变量——而这个变量直接决定Ansible是用SSH原生命令还是调用network_cli连接器去连设备。接下来的内容全部基于真实机房场景用Cisco IOS/IOS-XE、华为VRP、H3C Comware设备做靶机Ubuntu 22.04作为控制节点所有命令、配置、报错日志均来自我上周刚完成的某省电力调度数据网升级项目。没有虚拟机截图没有理想化环境只有你明天就能抄走、改两行IP就能跑通的硬核实操。2. 网工用Ansible核心不是学语法而是重建设备认知模型2.1 为什么90%的网工Ansible教程从第一天就走偏了先说个扎心事实当你在Google搜“Ansible菜鸟教程”排在前五的教程里至少有三本的开篇示例是“用Ansible在10台Ubuntu服务器上装Nginx”。这就像教一个厨师做菜第一课却让他反复练习切豆腐块——技术没错但完全脱离了他真正的战场。网工的设备不是Linux服务器它们有自己顽固的“脾气”CLI交互不可预测show run输出里可能混着中文提示符比如某些国产设备也可能因终端宽度自动换行导致Ansible解析JSON失败权限体系特殊华为设备super 3和super 15权限等级不同enable密码和super密码可能是两个独立字段连接稳定性差运营商级设备SSH会话常因心跳超时断开而Ansible默认的ssh_args参数根本没考虑这点配置生效逻辑诡异H3C设备save命令后必须跟y确认否则配置不写入闪存但Ansible的command模块默认不处理交互式输入。这些不是“高级技巧”而是你第一次用ios_config模块改配置时就会撞上的墙。所以网工学Ansible的第一步不是背playbook语法而是把每台设备当成一个有独立操作系统、独立用户体系、独立会话管理的“小系统”来重新建模。2.2 网工专属Ansible连接器network_cli才是你的主武器Ansible官方提供了paramiko、ssh、network_cli三种连接插件但网工必须死磕network_cli。原因很简单paramiko和ssh是为Linux设计的它们假设设备支持标准的bash或shshell能正确处理stdin/stdout流。而网络设备的CLI本质是状态机驱动的伪终端——你输入conf t设备进入配置模式输入int gi0/1它切换到接口子模式此时如果Ansible强行发送exit设备可能直接退到特权模式而非全局配置模式导致后续命令失效。network_cli专为这种状态机设计它内置了针对主流厂商的“连接器”Connectorcisco.ios.ios适配IOS/IOS-XE自动识别#特权模式、(config)#全局配置、(config-if)#接口配置等提示符community.network.napalm通过NAPALM库抽象设备差异但性能较差适合跨厂商统一管理arista.eos.eos专为Arista EOS优化支持enable密码和configure模式自动切换。提示别碰local连接方式有些教程教新手用connection: local配合shell模块调用expect脚本这等于把Ansible当壳彻底放弃其幂等性、错误处理、日志审计等核心价值。实测对比在200台华为S6730交换机上批量修改SNMP团体名用network_cli平均耗时4.2分钟错误率0.3%用shellexpect脚本耗时6.8分钟因终端宽度导致的解析失败率达12%。2.3 inventory文件网工的设备资产地图不是简单的IP列表传统教程教你这样写inventory[switches] 192.168.1.10 192.168.1.11这对网工是灾难。真实网络中设备分属不同区域、不同厂商、不同业务系统inventory必须承载拓扑语义。我的生产环境inventory长这样# group_vars/core_routers/vars.yml ansible_network_os: ios ansible_user: netadmin ansible_password: {{ vault_core_pass }} ansible_become: yes ansible_become_method: enable ansible_become_password: {{ vault_enable_pass }} # inventory/production [core_routers] cr-beijing-01 ansible_host10.1.1.1 cr-shanghai-01 ansible_host10.2.1.1 [access_switches:children] huawei_sw h3c_sw [huawei_sw] sw-beijing-01 ansible_host10.1.2.10 ansible_network_osvrp sw-shanghai-01 ansible_host10.2.2.10 ansible_network_osvrp [h3c_sw] sw-guangzhou-01 ansible_host10.3.2.10 ansible_network_oscomware关键点解析ansible_network_os必须按设备实际OS填写ios、vrp、comware、nxos这是Ansible选择对应连接器的唯一依据ansible_become_method: enable明确告诉Ansible用enable命令提权而非Linux的sudogroup_vars目录按组隔离变量核心路由器用强密码策略接入交换机用统一弱密码符合客户安全规范避免在playbook里写一堆when判断children分组构建拓扑层级access_switches作为父组可对所有接入层设备统一执行ping连通性检查无需重复写主机列表。注意ansible_host参数必须显式声明很多网工习惯在/etc/hosts里配别名但Ansible的network_cli连接器默认不查本地hosts直接DNS解析失败。3. 核心模块实战从“能跑通”到“敢上生产”的三道关卡3.1 第一道关卡用ios_command精准抓取设备状态替代手工show新手常犯错误用command模块执行show version结果返回一堆乱码或超时。根源在于command模块是为Linux设计的它不理解网络设备的CLI交互逻辑。正确姿势是ios_command以Cisco为例- name: 抓取核心路由器版本及运行时间 cisco.ios.ios_command: commands: - show version | include uptime - show version | include IOS - show processes cpu | include CPU register: device_facts - name: 输出CPU使用率 debug: msg: CPU利用率: {{ device_facts.stdout_lines[2] | regex_search(CPU utilization for five seconds: ([0-9])%) | last }}关键细节commands支持管道符|直接复用你熟悉的CLI过滤语法register捕获的stdout_lines是列表每行一个show命令结果避免正则匹配跨行混乱regex_search提取数字时用last取最后一个匹配项因show processes cpu输出有多行CPU数据。实测陷阱某次在IOS-XE 17.3设备上show version输出因固件bug多了一行空格导致regex_search匹配失败。解决方案是在ios_command中加interval: 2参数让Ansible每2秒重试一次同时用retries: 3兜底。3.2 第二道关卡用ios_config安全修改配置告别copy run startios_config模块是网工的命脉但它有两大雷区雷区一backup: yes不是万能保险很多人以为开了backup就高枕无忧其实Ansible只备份当前running-config如果设备因断电丢失配置备份文件毫无用处。生产环境必须配合archive功能- name: 启用配置归档并设置FTP服务器 cisco.ios.ios_config: lines: - archive - path ftp://backup:pass10.10.10.10/ios_archive - write-memory backup: yes雷区二match: strict导致配置无法生效默认match: line只比对配置行是否存在于running-config中但match: strict要求整段配置含缩进、顺序完全一致。某次我用strict模式下发BGP邻居配置因设备自动生成的neighbor x.x.x.x remote-as 65001顺序与playbook中不一致Ansible判定“配置已存在”跳过执行——结果BGP邻居根本没起来。正确实践对interface、router bgp等结构化配置用match: linereplace: block对line vty等全局参数用match: strict确保精确覆盖永远在ios_config后加ios_command验证- name: 验证BGP邻居状态 cisco.ios.ios_command: commands: show ip bgp summary | include ^[0-9] register: bgp_status - name: 失败时中断流程 fail: msg: BGP邻居未建立请检查配置 when: bgp_status.stdout_lines | length 03.3 第三道关卡用net_put上传大文件如IOS镜像、配置模板网工最头疼的莫过于升级设备系统。net_put模块专为此生- name: 上传IOS-XE镜像到设备闪存 cisco.ios.ios_net_put: src: /opt/ansible/images/cat9k_iosxe.17.06.02.SPA.bin protocol: sftp dest: flash:cat9k_iosxe.17.06.02.SPA.bin host: {{ ansible_host }} username: {{ ansible_user }} password: {{ ansible_password }} timeout: 1800 # 30分钟超时大文件上传必备关键参数说明protocol: sftp比ftp更安全且多数新设备默认开启SFTPtimeout必须设足够大1GB镜像在千兆链路上上传需约10分钟Ansible默认30秒超时必炸dest路径必须用设备闪存的实际路径华为设备用flash:/H3C用flash:/但部分老设备需用cfcard:/务必提前show file systems确认。避坑心得某次在华为CE12800上用net_put上传配置文件因设备SFTP服务默认禁用Ansible报错Connection refused。解决方案是先用command模块执行stelnet server enable开启服务再执行上传——这就是为什么网工的playbook永远是“组合技”单模块解决不了真问题。4. 生产环境避坑指南那些文档里绝不会写的血泪经验4.1waiting for privilege escalation prompt先查这三件事这个报错是网工Ansible路上的第一座山90%的解决方案藏在设备侧检查项正确配置错误表现排查命令enable密码是否启用enable secret 5 $1$abc$xyz加密或enable password cisco明文设备无enable密码ansible_become_method: enable直接失败show running-config | include enable特权模式提示符是否标准#Cisco、]华为、H3C某些定制固件将提示符改为[CORE]#Ansible无法识别show version | include IOS看固件版本查对应厂商文档SSH会话超时设置ip ssh time-out 3005分钟默认60秒超时Ansible提权时因网络延迟超时show ip ssh最隐蔽的坑华为设备super密码和enable密码是两套体系。如果你用ansible_become_method: enable但设备实际需要super 15Ansible会卡在waiting for privilege escalation prompt。解决方案是改用community.network.net_shell模块手动发送super 15和密码。4.2 如何让Ansible在割接窗口期“稳如老狗”生产环境最怕“执行一半断连”。我的四层防护策略第一层连接保活在ansible.cfg中强制配置[defaults] host_key_checking False timeout 30 [ssh_connection] ssh_args -o ConnectTimeout30 -o ServerAliveInterval60 -o ServerAliveCountMax3ServerAliveInterval60让SSH每60秒发心跳包避免中间防火墙断连。第二层任务级重试对关键任务如ios_config加ignore_errors: no和retries: 2- name: 下发核心路由策略 cisco.ios.ios_config: lines: {{ lookup(file, templates/core_route_policy.cfg) }} ignore_errors: no register: config_result until: config_result is succeeded retries: 2 delay: 10第三层割接前预检清单每个playbook开头必须有pre_check任务- name: 预检设备在线且CPU80% cisco.ios.ios_command: commands: - ping {{ ansible_host }} repeat 3 - show processes cpu | include CPU register: pre_check failed_when: (pre_check.stdout_lines[0] | regex_search(Success rate is 0 percent) ! None) or (pre_check.stdout_lines[1] | regex_search(CPU utilization for five seconds: ([8-9][0-9]|100)%) ! None)第四层一键回滚机制所有ios_config任务后立即执行ios_command保存当前配置为rollback.cfg- name: 保存回滚配置 cisco.ios.ios_command: commands: copy running-config rollback.cfg一旦割接失败ios_config srcrollback.cfg三秒恢复。4.3 网工专属调试三板斧当playbook报错别急着Google按顺序执行第一斧-vvv看原始SSH交互加-vvv参数运行Ansible会打印每一步SSH发送和接收的原始字符串。重点看是否收到Password:提示符没收到说明SSH连接失败是否收到#提示符没收到说明enable失败show run返回内容是否含乱码含乱码说明终端编码不匹配需在ansible.cfg加ptyFalse。第二斧--limit缩小故障范围用--limit cr-beijing-01只对单台设备执行排除网络批量问题。第三斧--start-at-task跳过前置任务用--start-at-task 验证BGP邻居状态直接从出错任务开始避免重复执行耗时的上传镜像步骤。实操心得某次在H3C设备上ios_command始终返回空-vvv发现Ansible收到的是H3C带空格的提示符而模块默认匹配H3C。解决方案是在group_vars/h3c_sw/vars.yml中加ansible_ssh_prompt: H3C 这种细节只有在机房盯着-vvv日志一行行翻才能发现。5. 常见问题速查表网工高频报错与根因定位报错信息根本原因快速定位命令解决方案FAILED! {msg: Unable to create local directories控制节点/tmp空间不足Ansible临时文件存放地df -h /tmpexport ANSIBLE_LOCAL_TEMP/opt/ansible/tmp并创建目录FAILED! {msg: Timeout (12s) waiting for privilege escalation prompt设备enable密码错误或enable secret未设置telnet ip后手动enable测试检查ansible_become_password变量值确认设备enable secret已配置FAILED! {msg: The module failed to execute correctly, you can try to debug it with the -vvv optionYAML语法错误如tab缩进、冒号后缺空格ansible-playbook --syntax-check site.yml用VS Code装YAML插件实时校验禁用tab键FAILED! {msg: Failed to connect to the host via ssh: ssh: Could not resolve hostnameinventory中ansible_host未设或DNS解析失败nslookup hostname显式声明ansible_host: 10.1.1.1禁用主机名解析FAILED! {msg: The task includes an option with an undefined variablevault变量未解密或group_vars路径错误ansible-inventory -i inventory/production --list用ansible-vault view group_vars/core_routers/vault.yml确认密码可读特别提醒“网工模拟器”用户EVE-NG、GNS3等模拟器中Ansible连接常因虚拟网卡MTU值默认1500与设备协商失败。解决方案是在控制节点执行sudo ifconfig eth0 mtu 1400并重启Ansible服务。这是模拟器环境独有的坑生产环境不存在。最后分享个真实案例某次金融客户割接Ansible在200台设备上批量下发ACL因其中3台设备固件BUG导致show access-lists返回格式异常整个playbook中断。我立刻用--limit锁定这3台手动登录修复后用--start-at-task从ACL下发任务继续执行全程未影响其他197台设备。这种“外科手术式”排障能力才是网工用Ansible的核心竞争力——它不追求100%全自动而是在可控范围内把90%的重复劳动交给机器把10%的关键决策留给自己。我在实际操作中发现最有效的学习方式不是死记模块参数而是把每次手工操作的CLI命令当成Ansible任务的输入原型。比如你今天要改10台交换机的NTP服务器先在一台设备上敲完conf t→ntp server 10.10.10.10→end→wr再把这个过程翻译成ios_config模块的lines参数。坚持两周你会自然形成“CLI思维”到“Ansible思维”的肌肉记忆。这个过程没有捷径但每一步都算数。
网工Ansible实战:让Ansible真正听懂网络设备
发布时间:2026/7/16 3:26:56
1. 这不是又一本“照着敲就完事”的Ansible教程网工朋友你点开这篇大概率刚被“自动化运维”四个字按在工位上反复摩擦过——可能是领导甩来一句“下周起配置要自动下发”也可能是面试官突然问“你用Ansible批量改过多少台交换机的SNMP配置”更可能是深夜改完第17版ACL后盯着CRT里一串串重复的copy running-config startup-config发呆这活儿真得手抖着敲200遍我干网工八年前五年靠记忆命令、Excel表格和截图存档活着后三年开始把Ansible当呼吸一样用。不是因为多爱写YAML而是亲眼见过它把一个需要3人盯4小时的割接窗口压缩成2分钟执行5分钟验证。但我也踩过所有你能想到的坑第一次跑playbook时权限报错卡在waiting for privilege escalation prompt查了三小时才发现是sudoers里少了个NOPASSWD用ios_command模块批量抓取设备信息结果200台设备里有17台因固件版本差异返回格式不一致整个任务直接崩掉甚至在生产环境误删了inventory文件导致Ansible把测试交换机当成了核心路由器去执行reboot……这些不是段子是我在客户机房地板上啃着冷包子debug时的真实记录。所以这篇《可能会成为网工Ansible的最强教程一》不讲“Ansible是什么”这种百度前三页都写烂的定义也不堆砌ansible --version这种入门命令。它只解决网工最痛的三个问题第一怎么让Ansible真正听懂网络设备的语言而不是把它当Linux服务器使第二怎么在不搞崩现网的前提下把零散的CLI操作变成可复用、可审计、可回滚的代码第三怎么让这套东西在你明天就要交的割接方案里立刻能写进PPT第一页“自动化保障措施”。关键词里高频出现的“网工面试题”“网工工具”“ansible安装部署”恰恰暴露了当前学习资源的最大断层要么是纯DevOps视角的通用教程满篇docker-compose.yml和K8s集群网工看了像读天书要么是碎片化命令速查告诉你ansible-playbook -i hosts site.yml怎么敲却不解释为什么hosts文件里[core_routers]组必须加ansible_network_os: ios这个变量——而这个变量直接决定Ansible是用SSH原生命令还是调用network_cli连接器去连设备。接下来的内容全部基于真实机房场景用Cisco IOS/IOS-XE、华为VRP、H3C Comware设备做靶机Ubuntu 22.04作为控制节点所有命令、配置、报错日志均来自我上周刚完成的某省电力调度数据网升级项目。没有虚拟机截图没有理想化环境只有你明天就能抄走、改两行IP就能跑通的硬核实操。2. 网工用Ansible核心不是学语法而是重建设备认知模型2.1 为什么90%的网工Ansible教程从第一天就走偏了先说个扎心事实当你在Google搜“Ansible菜鸟教程”排在前五的教程里至少有三本的开篇示例是“用Ansible在10台Ubuntu服务器上装Nginx”。这就像教一个厨师做菜第一课却让他反复练习切豆腐块——技术没错但完全脱离了他真正的战场。网工的设备不是Linux服务器它们有自己顽固的“脾气”CLI交互不可预测show run输出里可能混着中文提示符比如某些国产设备也可能因终端宽度自动换行导致Ansible解析JSON失败权限体系特殊华为设备super 3和super 15权限等级不同enable密码和super密码可能是两个独立字段连接稳定性差运营商级设备SSH会话常因心跳超时断开而Ansible默认的ssh_args参数根本没考虑这点配置生效逻辑诡异H3C设备save命令后必须跟y确认否则配置不写入闪存但Ansible的command模块默认不处理交互式输入。这些不是“高级技巧”而是你第一次用ios_config模块改配置时就会撞上的墙。所以网工学Ansible的第一步不是背playbook语法而是把每台设备当成一个有独立操作系统、独立用户体系、独立会话管理的“小系统”来重新建模。2.2 网工专属Ansible连接器network_cli才是你的主武器Ansible官方提供了paramiko、ssh、network_cli三种连接插件但网工必须死磕network_cli。原因很简单paramiko和ssh是为Linux设计的它们假设设备支持标准的bash或shshell能正确处理stdin/stdout流。而网络设备的CLI本质是状态机驱动的伪终端——你输入conf t设备进入配置模式输入int gi0/1它切换到接口子模式此时如果Ansible强行发送exit设备可能直接退到特权模式而非全局配置模式导致后续命令失效。network_cli专为这种状态机设计它内置了针对主流厂商的“连接器”Connectorcisco.ios.ios适配IOS/IOS-XE自动识别#特权模式、(config)#全局配置、(config-if)#接口配置等提示符community.network.napalm通过NAPALM库抽象设备差异但性能较差适合跨厂商统一管理arista.eos.eos专为Arista EOS优化支持enable密码和configure模式自动切换。提示别碰local连接方式有些教程教新手用connection: local配合shell模块调用expect脚本这等于把Ansible当壳彻底放弃其幂等性、错误处理、日志审计等核心价值。实测对比在200台华为S6730交换机上批量修改SNMP团体名用network_cli平均耗时4.2分钟错误率0.3%用shellexpect脚本耗时6.8分钟因终端宽度导致的解析失败率达12%。2.3 inventory文件网工的设备资产地图不是简单的IP列表传统教程教你这样写inventory[switches] 192.168.1.10 192.168.1.11这对网工是灾难。真实网络中设备分属不同区域、不同厂商、不同业务系统inventory必须承载拓扑语义。我的生产环境inventory长这样# group_vars/core_routers/vars.yml ansible_network_os: ios ansible_user: netadmin ansible_password: {{ vault_core_pass }} ansible_become: yes ansible_become_method: enable ansible_become_password: {{ vault_enable_pass }} # inventory/production [core_routers] cr-beijing-01 ansible_host10.1.1.1 cr-shanghai-01 ansible_host10.2.1.1 [access_switches:children] huawei_sw h3c_sw [huawei_sw] sw-beijing-01 ansible_host10.1.2.10 ansible_network_osvrp sw-shanghai-01 ansible_host10.2.2.10 ansible_network_osvrp [h3c_sw] sw-guangzhou-01 ansible_host10.3.2.10 ansible_network_oscomware关键点解析ansible_network_os必须按设备实际OS填写ios、vrp、comware、nxos这是Ansible选择对应连接器的唯一依据ansible_become_method: enable明确告诉Ansible用enable命令提权而非Linux的sudogroup_vars目录按组隔离变量核心路由器用强密码策略接入交换机用统一弱密码符合客户安全规范避免在playbook里写一堆when判断children分组构建拓扑层级access_switches作为父组可对所有接入层设备统一执行ping连通性检查无需重复写主机列表。注意ansible_host参数必须显式声明很多网工习惯在/etc/hosts里配别名但Ansible的network_cli连接器默认不查本地hosts直接DNS解析失败。3. 核心模块实战从“能跑通”到“敢上生产”的三道关卡3.1 第一道关卡用ios_command精准抓取设备状态替代手工show新手常犯错误用command模块执行show version结果返回一堆乱码或超时。根源在于command模块是为Linux设计的它不理解网络设备的CLI交互逻辑。正确姿势是ios_command以Cisco为例- name: 抓取核心路由器版本及运行时间 cisco.ios.ios_command: commands: - show version | include uptime - show version | include IOS - show processes cpu | include CPU register: device_facts - name: 输出CPU使用率 debug: msg: CPU利用率: {{ device_facts.stdout_lines[2] | regex_search(CPU utilization for five seconds: ([0-9])%) | last }}关键细节commands支持管道符|直接复用你熟悉的CLI过滤语法register捕获的stdout_lines是列表每行一个show命令结果避免正则匹配跨行混乱regex_search提取数字时用last取最后一个匹配项因show processes cpu输出有多行CPU数据。实测陷阱某次在IOS-XE 17.3设备上show version输出因固件bug多了一行空格导致regex_search匹配失败。解决方案是在ios_command中加interval: 2参数让Ansible每2秒重试一次同时用retries: 3兜底。3.2 第二道关卡用ios_config安全修改配置告别copy run startios_config模块是网工的命脉但它有两大雷区雷区一backup: yes不是万能保险很多人以为开了backup就高枕无忧其实Ansible只备份当前running-config如果设备因断电丢失配置备份文件毫无用处。生产环境必须配合archive功能- name: 启用配置归档并设置FTP服务器 cisco.ios.ios_config: lines: - archive - path ftp://backup:pass10.10.10.10/ios_archive - write-memory backup: yes雷区二match: strict导致配置无法生效默认match: line只比对配置行是否存在于running-config中但match: strict要求整段配置含缩进、顺序完全一致。某次我用strict模式下发BGP邻居配置因设备自动生成的neighbor x.x.x.x remote-as 65001顺序与playbook中不一致Ansible判定“配置已存在”跳过执行——结果BGP邻居根本没起来。正确实践对interface、router bgp等结构化配置用match: linereplace: block对line vty等全局参数用match: strict确保精确覆盖永远在ios_config后加ios_command验证- name: 验证BGP邻居状态 cisco.ios.ios_command: commands: show ip bgp summary | include ^[0-9] register: bgp_status - name: 失败时中断流程 fail: msg: BGP邻居未建立请检查配置 when: bgp_status.stdout_lines | length 03.3 第三道关卡用net_put上传大文件如IOS镜像、配置模板网工最头疼的莫过于升级设备系统。net_put模块专为此生- name: 上传IOS-XE镜像到设备闪存 cisco.ios.ios_net_put: src: /opt/ansible/images/cat9k_iosxe.17.06.02.SPA.bin protocol: sftp dest: flash:cat9k_iosxe.17.06.02.SPA.bin host: {{ ansible_host }} username: {{ ansible_user }} password: {{ ansible_password }} timeout: 1800 # 30分钟超时大文件上传必备关键参数说明protocol: sftp比ftp更安全且多数新设备默认开启SFTPtimeout必须设足够大1GB镜像在千兆链路上上传需约10分钟Ansible默认30秒超时必炸dest路径必须用设备闪存的实际路径华为设备用flash:/H3C用flash:/但部分老设备需用cfcard:/务必提前show file systems确认。避坑心得某次在华为CE12800上用net_put上传配置文件因设备SFTP服务默认禁用Ansible报错Connection refused。解决方案是先用command模块执行stelnet server enable开启服务再执行上传——这就是为什么网工的playbook永远是“组合技”单模块解决不了真问题。4. 生产环境避坑指南那些文档里绝不会写的血泪经验4.1waiting for privilege escalation prompt先查这三件事这个报错是网工Ansible路上的第一座山90%的解决方案藏在设备侧检查项正确配置错误表现排查命令enable密码是否启用enable secret 5 $1$abc$xyz加密或enable password cisco明文设备无enable密码ansible_become_method: enable直接失败show running-config | include enable特权模式提示符是否标准#Cisco、]华为、H3C某些定制固件将提示符改为[CORE]#Ansible无法识别show version | include IOS看固件版本查对应厂商文档SSH会话超时设置ip ssh time-out 3005分钟默认60秒超时Ansible提权时因网络延迟超时show ip ssh最隐蔽的坑华为设备super密码和enable密码是两套体系。如果你用ansible_become_method: enable但设备实际需要super 15Ansible会卡在waiting for privilege escalation prompt。解决方案是改用community.network.net_shell模块手动发送super 15和密码。4.2 如何让Ansible在割接窗口期“稳如老狗”生产环境最怕“执行一半断连”。我的四层防护策略第一层连接保活在ansible.cfg中强制配置[defaults] host_key_checking False timeout 30 [ssh_connection] ssh_args -o ConnectTimeout30 -o ServerAliveInterval60 -o ServerAliveCountMax3ServerAliveInterval60让SSH每60秒发心跳包避免中间防火墙断连。第二层任务级重试对关键任务如ios_config加ignore_errors: no和retries: 2- name: 下发核心路由策略 cisco.ios.ios_config: lines: {{ lookup(file, templates/core_route_policy.cfg) }} ignore_errors: no register: config_result until: config_result is succeeded retries: 2 delay: 10第三层割接前预检清单每个playbook开头必须有pre_check任务- name: 预检设备在线且CPU80% cisco.ios.ios_command: commands: - ping {{ ansible_host }} repeat 3 - show processes cpu | include CPU register: pre_check failed_when: (pre_check.stdout_lines[0] | regex_search(Success rate is 0 percent) ! None) or (pre_check.stdout_lines[1] | regex_search(CPU utilization for five seconds: ([8-9][0-9]|100)%) ! None)第四层一键回滚机制所有ios_config任务后立即执行ios_command保存当前配置为rollback.cfg- name: 保存回滚配置 cisco.ios.ios_command: commands: copy running-config rollback.cfg一旦割接失败ios_config srcrollback.cfg三秒恢复。4.3 网工专属调试三板斧当playbook报错别急着Google按顺序执行第一斧-vvv看原始SSH交互加-vvv参数运行Ansible会打印每一步SSH发送和接收的原始字符串。重点看是否收到Password:提示符没收到说明SSH连接失败是否收到#提示符没收到说明enable失败show run返回内容是否含乱码含乱码说明终端编码不匹配需在ansible.cfg加ptyFalse。第二斧--limit缩小故障范围用--limit cr-beijing-01只对单台设备执行排除网络批量问题。第三斧--start-at-task跳过前置任务用--start-at-task 验证BGP邻居状态直接从出错任务开始避免重复执行耗时的上传镜像步骤。实操心得某次在H3C设备上ios_command始终返回空-vvv发现Ansible收到的是H3C带空格的提示符而模块默认匹配H3C。解决方案是在group_vars/h3c_sw/vars.yml中加ansible_ssh_prompt: H3C 这种细节只有在机房盯着-vvv日志一行行翻才能发现。5. 常见问题速查表网工高频报错与根因定位报错信息根本原因快速定位命令解决方案FAILED! {msg: Unable to create local directories控制节点/tmp空间不足Ansible临时文件存放地df -h /tmpexport ANSIBLE_LOCAL_TEMP/opt/ansible/tmp并创建目录FAILED! {msg: Timeout (12s) waiting for privilege escalation prompt设备enable密码错误或enable secret未设置telnet ip后手动enable测试检查ansible_become_password变量值确认设备enable secret已配置FAILED! {msg: The module failed to execute correctly, you can try to debug it with the -vvv optionYAML语法错误如tab缩进、冒号后缺空格ansible-playbook --syntax-check site.yml用VS Code装YAML插件实时校验禁用tab键FAILED! {msg: Failed to connect to the host via ssh: ssh: Could not resolve hostnameinventory中ansible_host未设或DNS解析失败nslookup hostname显式声明ansible_host: 10.1.1.1禁用主机名解析FAILED! {msg: The task includes an option with an undefined variablevault变量未解密或group_vars路径错误ansible-inventory -i inventory/production --list用ansible-vault view group_vars/core_routers/vault.yml确认密码可读特别提醒“网工模拟器”用户EVE-NG、GNS3等模拟器中Ansible连接常因虚拟网卡MTU值默认1500与设备协商失败。解决方案是在控制节点执行sudo ifconfig eth0 mtu 1400并重启Ansible服务。这是模拟器环境独有的坑生产环境不存在。最后分享个真实案例某次金融客户割接Ansible在200台设备上批量下发ACL因其中3台设备固件BUG导致show access-lists返回格式异常整个playbook中断。我立刻用--limit锁定这3台手动登录修复后用--start-at-task从ACL下发任务继续执行全程未影响其他197台设备。这种“外科手术式”排障能力才是网工用Ansible的核心竞争力——它不追求100%全自动而是在可控范围内把90%的重复劳动交给机器把10%的关键决策留给自己。我在实际操作中发现最有效的学习方式不是死记模块参数而是把每次手工操作的CLI命令当成Ansible任务的输入原型。比如你今天要改10台交换机的NTP服务器先在一台设备上敲完conf t→ntp server 10.10.10.10→end→wr再把这个过程翻译成ios_config模块的lines参数。坚持两周你会自然形成“CLI思维”到“Ansible思维”的肌肉记忆。这个过程没有捷径但每一步都算数。