Ansible 2.5.0 ios_user、ios_ping模块故障排查求助
我在编写Ansible Playbook时突然遇到Module Error,折腾了半天定位不到原因。已经单独在CLI测试各模块及所有选项,执行语法检查(--syntax-check)也没问题,怀疑是模块兼容性Bug。
模块测试情况
正常运行的模块:ios_facts
执行命令:
$ ansible all -m ios_facts -i Resources/Inventory/hosts
返回结果:
10.20.30.111 | SUCCESS => {
"ansible_facts": { "ansible_net_all_ipv4_addresses": [ "10.20.30.111" ], "ansible_net_all_ipv6_addresses": [], "ansible_net_filesystems": [ "flash:" (...)
}
报错模块1:ios_ping
执行命令:
$ ansible all -m ios_ping -a"dest='1.1.1.1'" -i Resources/Inventory/hosts
返回错误:
10.20.30.111 | FAILED! => { "changed": false, "module_stderr": "Traceback (most recent call last):\n File "/tmp/ansible_WOH7nd/ansible_module_ios_ping.py", line 215, in \n main()\n File "/tmp/ansible_WOH7nd/ansible_module_ios_ping.py", line 151, in main\n success, rx, tx, rtt = parse_ping(stats)\n File "/tmp/ansible_WOH7nd/ansible_module_ios_ping.py", line 200, in parse_ping\n return rate.group("pct"), rate.group("rx"), rate.group("tx"), rtt.groupdict()\nAttributeError: 'NoneType' object has no attribute 'group'\n", "module_stdout": "", "msg": "MODULE FAILURE", "rc": 1}
报错模块2:ios_user
返回错误:
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: ASwitch#
10.20.30.111 | FAILED! => { "changed": false, "module_stderr": "Traceback (most recent call last):\n File "/tmp/ansible_UX9ZWc/ansible_module_ios_user.py", line 409, in \n main()\n File "/tmp/ansible_UX9ZWc/ansible_module_ios_user.py", line 382, in main\n have = map_config_to_obj(module)\n File "/tmp/ansible_UX9ZWc/ansible_module_ios_user.py", line 242, in map_config_to_obj\n data = get_config(module, flags=['| section username'])\n File "/tmp/ansible_UX9ZWc/ansible_modlib.zip/ansible/module_utils/network/ios/ios.py", line 117, in get_config\n File "/tmp/ansible_UX9ZWc/ansible_modlib.zip/ansible/module_utils/connection.py", line 146, in rpc\nansible.module_utils.connection.ConnectionError: show running-config | section username\r\n ^\r\n% Invalid input detected at '^' marker.\r\n\r\nASwitch#\n", "module_stdout": "", "msg": "MODULE FAILURE", "rc": 1 }
环境信息
- Ansible版本:
2.5.0 - Cisco IOS版本:
12.2(55)SE - 设备连接正常,
ios_system模块可正常执行
请问该如何排查此问题?
我的分析与排查建议
1. 先解决ios_user的报错(最明确的原因)
从错误日志一眼就能看出来:Ansible在设备上执行show running-config | section username被拒绝了——你的IOS版本12.2(55)SE根本不支持| section这个管道命令!这个过滤命令是IOS 12.4T及以后才引入的老版本只能用| include或者手动筛选输出。
解决思路:
- 能升级IOS的话,直接升到12.4T或更高版本,原生支持
| section; - 没法升级的话,要么先用
ios_command模块替代ios_user,手动执行show running-config | include username来获取用户配置,再自己处理用户管理逻辑;要么升级Ansible到更高版本(比如2.9+),新版本的IOS模块会自动对老IOS做兼容,把section替换成include。
2. 再处理ios_ping的报错
这个错误是模块的正则匹配失败导致的:parse_ping函数没法匹配你设备返回的ping结果格式,正则表达式返回了None,然后调用group()方法就炸了。
原因就是你的老IOS版本输出的ping结果格式,和Ansible 2.5.0里ios_ping模块预期的格式不一样。比如老IOS的ping统计字段排版、关键字可能和模块预设的正则不匹配。
排查&解决步骤:
- 手动在设备上执行
ping 1.1.1.1,把完整输出复制下来; - 找到本地Ansible的
ansible_module_ios_ping.py文件,查看parse_ping函数里的正则表达式,对比你的设备输出看哪里不匹配; - 最快的解决办法还是升级Ansible(2.9及以上版本的
ios_ping对老IOS兼容性好很多),或者升级IOS让ping输出符合模块预期;如果不想升级,也可以自己修改模块里的正则表达式来适配你的设备输出。
3. 通用排查建议
- 优先升级Ansible版本:你用的2.5.0是2018年的老版本了,很多IOS模块的兼容性问题在后续版本都修复了,先升到2.9.x这种稳定的旧版本,或者最新稳定版再测试;
- 查模块兼容性文档:去Ansible官方文档确认每个模块支持的IOS版本,你用的2.5版本对IOS 12.2的支持本来就不完善;
- 开启详细日志:执行命令时加
-vvv参数,能看到模块和设备交互的全部细节,更容易定位问题; - 用
ios_command做替代测试:对报错的模块,先用ios_command手动执行对应的命令,比如ansible all -m ios_command -a "ping 1.1.1.1" -i Resources/Inventory/hosts,看设备返回的结果是否符合预期,判断是模块适配问题还是设备本身的问题。
内容的提问来源于stack exchange,提问作者David

