如何在 ansible "retries and until" 块中查找字符串?

How to find a string in ansible "retries and until" block?

我正在安装一些插件,然后在命令循环中检查状态。我想检查命令状态的结果,如果没有安装插件我想在重试模块的帮助下再次安装它。

- name: install plugins
  command: "run {{ item }}"
  with_items:
  - install plugins
  - status
  register: result
  until: result.stdout.find("InstallPlugin1 and InstallPlugin2") != -1
  retries: 5
  delay: 10

我正在使用寄存器来保存结果,我知道寄存器将结果保存在结果中,在这种情况下,它会将结果保存在 "results" 字典中。现在我想在 until 中检查状态命令结果中的一个字符串,它应该是结果字典的第二个值,但我无法获取它。 当我使用

debug: msg="{{ result['results'][1]['stdout'] }}" 

我可以看到 status 命令的输出,但我不知道如何在 until 模块中使用它。每当我在那里使用结果时,它都会出错。我想使用类似

的东西
until: result['results'][1]['stdout'].find("all systems go") != -1

我想这就是您要找的: until: "all systems go" in item['stdout']

您拥有的 register 语句将列出 with_items 循环中所有刺激的汇总结果,而您想要的条件是 item 本身。根据您正在做的事情,您甚至可能不需要注册该变量。

如果 run install pluginsrun status return 都像

installed: InstallPlugin1, InstallPlugin2

下面的任务将完成工作

- name: install plugins
  command: "run {{ item }}"
  loop:
    - install plugins
    - status
  register: result
  until:
    - result.stdout is search('InstallPlugin1')
    - result.stdout is search('InstallPlugin2')
  retries: 5
  delay: 10

如果只有 run status return 确认,则无法使用循环,因为 until 语句在每次迭代中都被计算。一个选项是连接命令。例如

- name: install plugins
  command: "run install plugins; run status"
  register: result
  until:
    - result.stdout is search('InstallPlugin1')
    - result.stdout is search('InstallPlugin2')
  retries: 5
  delay: 10


可以在每个循环中测试注册的 result。循环完成后,变量 result 将保持累加 result.results。可能值得回顾一下。

- debug:
    var: result