Ansible expect模块输入密码后无法执行后续命令如何解决
问题根因
- 响应匹配规则不符合实际输出逻辑:你设置的
<?i>:正则匹配范围过宽,没有正确匹配sudo su密码验证通过后返回的shell提示符,导致模块无法判定何时发送后续的ls命令。 - 命令执行完成后没有终止交互进程:ls执行完成后shell会话会持续处于等待输入状态,没有主动退出的话会触发模块的30秒超时阈值,最终返回错误。
修正方案
调整后的playbook示例如下,适配常规Linux shell提示符场景:
tasks: - name: testing expect expect: command: sudo su responses: # 不区分大小写匹配密码提示,输入密码后自动回车 (?i)password: "password\n" # 匹配root用户默认的#提示符,确认登录完成后执行ls '# ': "ls\n" # ls执行完成后再次匹配提示符,发送exit退出会话,避免超时 '# ': "exit\n" timeout: 30 echo: yes register: exp - debug: var=exp
如果你的shell提示符不是# 结尾,可以调整匹配规则为通用正则(?i)[#$] ,同时适配root和普通用户的提示符。
业务CLI适配说明
如果是对自定义业务CLI做自动化,只需要将上方的提示符匹配规则替换为CLI登录成功后返回的固定提示符即可,例如CLI返回MYCLI> 就将匹配规则改为MYCLI> 即可。
注意:生产环境禁止明文存储密码,建议通过ansible vault加密敏感变量,避免密码泄露。
内容的提问来源于stack exchange,提问作者Bindu G
相关产品推荐
相关产品推荐

