Ansible批量重载Cisco设备时任务挂起且超时失败问题求助
解决Ansible重载多台Cisco设备时的超时挂起问题
你碰到的这个情况其实很常见——Cisco设备执行reload命令后会直接断开SSH连接,而Ansible的cli_command模块默认会等着命令执行完返回结果,这就导致模块触发了30秒的超时限制,哪怕设备已经在重启了,任务还是会报失败。批量执行时第一台设备的断开还会干扰后续任务的正常流程,出现挂起的情况。
给你两个可行的解决方案:
方案一:异步执行+等待连接恢复
修改你的任务,让Ansible发送完重载命令后立刻继续下一个任务,不用傻等返回,然后专门加一个任务等待设备重启完成:
- name: 发送重载命令到设备 cli_command: command: "reload" prompt: - "Proceed with reload?" answer: - "y" ignore_errors: yes async: 60 # 给足够时间发送命令并触发重启 poll: 0 # 立即返回,不阻塞后续任务 - name: 等待设备重启后恢复连接 wait_for_connection: delay: 30 # 先等30秒再检测,给设备重启留时间 timeout: 300 # 最多等5分钟,可根据你的设备重启时长调整
这样一来,第一台设备发送完命令就会继续处理第二台,不会因为第一台断开连接而挂起,同时wait_for_connection会确保设备重启完成后再继续后续操作(如果有的话)。
方案二:用专门的Cisco重载模块
如果你管理的是Cisco IOS/IOS-XE设备,推荐直接用ios_reload模块,这个模块是专门为Cisco设备重载设计的,内置了处理重启的逻辑,比cli_command更靠谱:
- name: 重载Cisco设备并等待恢复 ios_reload: prompt: "Proceed with reload?" answer: "y" wait_for_reload: yes reload_timeout: 300 # 设置等待重启完成的超时时间
这个模块会自动发送重载命令、确认重启,然后等待设备重新上线,不需要手动处理超时和连接等待,批量执行时也不会出现挂起的问题。
原来的任务之所以失败,核心原因就是cli_command模块默认会等待命令执行的输出返回,但设备重启会直接断开SSH会话,模块在默认30秒超时内收不到任何返回,就会抛出超时错误,哪怕你加了ignore_errors: yes,还是会显示失败状态。
内容的提问来源于stack exchange,提问作者uncowandy
相关产品推荐
相关产品推荐

