You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发存储设备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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 02:17:53