首页 > 解决方案 > 来自 virsh 控制台的 Ansible 退出期望

问题描述

代码:

- expect:
    command: virsh console myguest
    responses:
      'Escape character is': ''
      'root>': 'show interfaces em0 | grep Current'
    timeout: 5
  register: result

这个任务将永远挂起。我相信是因为在执行完 show interface 命令后,系统仍然返回到 'root>' 提示下一个命令,并且由于我提供了 'root>' 响应,提示响应陷入了死循环。

我知道理想情况下我可以提供 2 个响应作为“root>”的列表,一个是 show 命令,另一个是 Ctrl-]。但是没有Ctrl-]的文字表达,我真的不能提供。

所以我设置了超时,希望它最多只能循环 5 秒。但事实并非如此。我将单个响应设置为列表项,但下一个响应的任务错误。

那么我可以做些什么来在 virsh 控制台中运行 show 命令,然后退出它,以便我的剧本可以继续?

标签: ansible

解决方案


您可以使用\u001d来表示^](CTRL-]) 并允许期望调用成功完成,或者超时并失败。

此外,您可以添加ignore_errors: true以允许您处理错误,而不是让 Ansible 立即失败。例如:

- expect:
    command: "virsh console {{ guest }}"
    responses:
      'Escape character is': ''
      'root>': 
        - 'show interfaces em0 | grep Current'
        - "\u001d"
    register: expect_response
    ignore_errors: true
- debug:
    msg: "Expect failed with rc={{ expect_response.rc }}"
  when: expect_response.failed

推荐阅读