Ansible (2.5.0) 模块故障 - ios_user,ios_ping



我正在编写 Ansible 剧本,突然我开始出现"模块错误",我不知道为什么。我在 CLI 中使用每个选项单独尝试了每个模块。我运行了语法检查(--syntax-check),没有问题。我认为这是一个错误。

"ios_facts"模块工作:

$ ansible all -m ios_facts -i Resources/Inventory/hosts 

10.20.30.111 |成功 => {

"ansible_facts": {
"ansible_net_all_ipv4_addresses": [
"10.20.30.111"
], 
"ansible_net_all_ipv6_addresses": [], 
"ansible_net_filesystems": [
"flash:"
(...)

"ios_ping"返回此错误:

$ ansible all -m ios_ping -a"dest='1.1.1.1'" -i Resources/Inventory/hosts

10.20.30.111 |失败!=> { "已更改": 假,"module_stderr": "回溯(最近一次调用): 文件 \"/tmp/ansible_WOH7nd/ansible_module_ios_ping.py\",第 215 行,在 main() 文件 \"/tmp/ansible_WOH7nd/ansible_module_ios_ping.py\" 中,第 151 行,在 main 成功中,rx,tx,rtt = parse_ping(stats) 文件 \"/tmp/ansible_WOH7nd/ansible_module_ios_ping.py\",第 200 行,在 parse_ping return rate.group(\"pct\"), rate.group(\"rx\"), rate.group(\"tx\"), rtt.groupdict()AttributeError: 'NoneType' 对象没有属性 'group'", "module_stdout": ", "msg": "MODULE FAILURE", "rc": 1}

"ios_user"返回此错误:

任务执行期间发生异常。要查看完整的回溯,请使用 -vvv。错误是:ASwitch#

10.20.30.111 |失败!=> { "已更改":假,"module_stderr": "回溯(最近一次调用): 文件 \"/tmp/ansible_UX9ZWc/ansible_module_ios_user.py\",第 409 行,在 main() 文件中,在 main() 文件中,ansible_UX9ZWc//ansible_module_ios_user.py\" 中,第 382 行,在 main 中 有 = map_config_to_obj(模块) 文件 \"/tmp/ansible_UX9ZWc/ansible_module_ios_user.py\",第 242 行,在 map_config_to_obj 数据 = get_config(模块, flags=['| 部分用户名]) 文件 \"/tmp/ansible_UX9ZWc/ansible_modlib.zip/ansible/module_utils/network/ios/ios.py\",第 117 行,在 get_config 文件 \"/tmp/ansible_UX9ZWc/ansible_modlib.zip/ansible/module_utils/connection.py\",第 146 行,在rpcansible.module_utils.connection.ConnectionError: show running-config |部分用户名\r ^\r% 在"^"标记处检测到无效输入。\r\rASwitch#", "module_stdout": ", "消息": "模块故障", "RC":1 }

IOS 配置:配置文本

Ansible 清单:资源/清单/主机

版本:2.5.0

思科 IOS 版本:12.2(55)SE

连接工作正常,我也能够执行"ios_system"模块。你们知道这可能是什么吗?

第二个错误表明

show running-config | section username

不是设备上的有效命令。你能尝试手动运行它吗,很可能它也会失败。我猜你的IOS对于大多数ios_模块来说太旧或太新了(12.2-你到底在运行什么?这也可以解释由于命令输出的差异而导致 ping 不起作用的原因。

事实证明,ios_user模块与Cisco IOS版本12.2(55)SE不兼容,因为它使用的是输出过滤器("section"),该过滤器不适用于该设备的版本。为了解决这个问题,我只需要在ansible/modules/network/ios/ios_user.py文件中将单词"section"替换为"include">(完整的文件路径取决于您的 ansible 安装,因为您可能正在使用虚拟环境)。 下面是模块代码。因此,代码的那部分如下所示:

def map_config_to_obj(module):
data = get_config(module, flags=['| include username'])
match = re.findall(r'^username (S+)', data, re.M)
if not match:
return list()

模块现在按预期工作。至于ios_ping,我一直在尝试对它的代码进行逆向工程,在我看来,它有多个错误。我认为只有当成功率高于0%时,它才有效.

最新更新