首页 > 解决方案 > 如何在ansible“重试和直到”块中找到一个字符串?

问题描述

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

- 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

我正在使用寄存器保存结果,我知道寄存器将结果保存在结果中,在这种情况下,它将结果保存在“结果”字典中。现在我想在直到状态命令的结果中检查一个字符串,它应该是结果字典的第二个值,但我无法抓住它。当我使用

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

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

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

标签: ansibleansible-template

解决方案


如果两者都run install plugins返回run status类似

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如果只返回确认,则不可能使用循环,因为在每次迭代中都会评估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.results。可能值得回顾一下。

- debug:
    var: result

推荐阅读