Ansible使用expect模块调用virsh console执行命令后如何正常退出
根因说明
- 当前配置为
root>提示符配置了全局响应,只要匹配到该提示符就会发送show interfaces命令,命令执行完成后系统再次返回root>提示符,触发循环匹配,导致任务永久挂起 - 配置的5秒超时未生效的原因是:expect模块的timeout仅在持续无匹配输出时才会触发,你配置的规则会被持续命中,每次命中都会重置超时计时器,因此超时永远不会触发
可行解决方案
方案1:执行命令后自动退出登录(最简便)
在需要执行的show命令末尾拼接退出会话的指令,命令执行完成后会自动结束root会话,virsh console会随之自动断开,无需处理特殊控制字符:
- expect: command: virsh console myguest responses: 'Escape character is': '' 'root>': 'show interfaces em0 | grep Current; exit' timeout: 5 register: result
方案2:发送Ctrl+]控制字符退出控制台
Ctrl+]对应的十六进制ASCII控制字符为\x1d,你可以给root>配置顺序响应列表,第一次匹配到提示符时发送show命令,第二次匹配到提示符时发送控制字符退出控制台,注意给控制字符添加newline: false参数,避免额外发送回车导致退出失效:
- expect: command: virsh console myguest responses: 'Escape character is': '' 'root>': - 'show interfaces em0 | grep Current' - response: '\x1d' newline: no timeout: 5 register: result
此前你配置列表触发报错,基本都是YAML缩进格式不正确导致的,按照上述示例格式配置即可正常运行。
内容的提问来源于stack exchange,提问作者Gary521
相关产品推荐
相关产品推荐

