开发存储设备Ansible网络模块:交互式命令超时故障排查
解决Ansible模块处理多轮交互式命令超时问题
问题背景
开发某款存储设备的Ansible网络模块时,现有代码可正常处理非交互式命令,但无法处理需要多轮用户输入的交互式命令(如修改用户密码需两次输入密码),触发超时错误。
现有代码
from ansible.module_utils.connection import Connection def run_commands(module, command, prompt=None, answer=None): connection = Connection(module._socket_path) out = connection.send_command(command=command, prompt=prompt, answer=answer)
错误信息
FAILED! => {"changed": false, "msg": "command timeout triggered, timeout value is 30 secs. See the timeout setting options in the Network Debug and Troubleshooting Guide.", "rc": -32603}
命令示例
可正常运行的非交互式命令
sysadmin@toad# user show list User list from node "localhost". Name Uid Role Last Login From Last Login Time Status Disable Date -------- --- ----- --------------- ------------------------ ------- ------------ sysadmin 100 admin 192.168.31.44 Mon Oct 17 04:20:44 2022 enabled never testuser 500 user <unknown> never enabled never username 501 user <unknown> never locked never -------- --- ----- --------------- ------------------------ ------- ------------ 3 users found.
无法处理的交互式命令
sysadmin@toad# user change password testuser Enter new password: Re-enter new password: Passwords matched.
解决方案
超时根源在于模块未正确匹配设备的交互提示,导致持续等待直至超时。需针对多轮交互场景调整代码并精准匹配提示:
1. 精准匹配交互提示(正则表达式)
设备的提示包含前导空格,需用正则匹配任意前导空白字符,确保能准确捕获提示信息。
2. 支持多轮交互
send_command函数的prompt和answer参数可接受列表,对应多轮的提示与应答,按顺序匹配执行。
3. 修改后的代码
from ansible.module_utils.connection import Connection import re def run_commands(module, command, prompt=None, answer=None): connection = Connection(module._socket_path) # 处理多轮交互,传递正则匹配的提示列表与应答列表 out = connection.send_command( command=command, prompt=prompt, answer=answer, # 可选:根据设备响应速度调整超时时间 timeout=60, # 可选:忽略大小写匹配提示(如果设备提示大小写不固定) flags=re.I ) return out
4. 调用示例(处理改密码命令)
# 定义多轮交互的提示与应答 prompt_patterns = [ r'^\s*Enter new password:', r'^\s*Re-enter new password:' ] password_answers = ['YourNewPassword123', 'YourNewPassword123'] # 调用函数执行交互式命令 result = run_commands( module, 'user change password testuser', prompt=prompt_patterns, answer=password_answers )
关键注意事项
- 正则表达式需严格匹配设备输出的提示内容,包括空格、标点符号;
- 若设备响应较慢,可适当延长
timeout参数值(如60秒); - 确认所使用的Ansible连接插件(如
network_cli)支持多轮交互式命令处理。
内容的提问来源于stack exchange,提问作者Alex Sviridov
相关产品推荐
相关产品推荐

