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

如何在ansible“retries and until”块中查找字符串?,ansible,ansible-template,Ansible,Ansible Template,我正在安装一些插件,然后在命令循环中检查状态。我想检查命令状态的结果,如果插件没有安装,我想在重试模块的帮助下再次安装 - name: install plugins command: "run {{ item }}" with_items: - install plugins - status register: result until: result.stdout.find("InstallPlugin1 and InstallPlugin2") != -1 r

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

- 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
我正在使用register保存结果,我知道register会将结果保存在results中,在这种情况下,它会将结果保存在results dict中。现在我想在status命令的result中检查一个字符串,它应该是results dictionary的第二个值,但我无法获取它。 当我使用

debug: msg="{{ result['results'][1]['stdout'] }}" 
我可以看到status命令的输出,但我不知道如何在模块中使用它。每当我在那里使用结果时,它都会给出一个错误。我想用像这样的东西

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

我想这就是你想要的: 直到:所有系统进入项目['stdout']


您拥有的register语句将列出with_items循环中所有刺激的聚合结果,并且您希望以该项本身为条件。根据您所做的工作,您甚至可能不需要注册该变量。

我认为这就是您要寻找的: 直到:所有系统进入项目['stdout']

您拥有的register语句将列出with_items循环中所有刺激的聚合结果,并且您希望以该项本身为条件。根据您正在执行的操作,您甚至可能不需要注册该变量。

如果运行安装插件和运行状态都返回

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
如果仅运行状态返回确认,则不可能使用循环,因为在每次迭代中都会计算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.results。也许值得回顾一下

- debug:
    var: result
如果运行安装插件和运行状态都返回

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
如果仅运行状态返回确认,则不可能使用循环,因为在每次迭代中都会计算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.results。也许值得回顾一下

- debug:
    var: result

谢谢你的回答Vladimir,我知道Till会检查每次迭代的结果。在这种情况下,结果应该是这里提到的字典。我知道我想要的字符串是结果字典的第二个值。我可以在打印结果字典时看到它。谢谢你的回答,弗拉基米尔,我知道我们会检查每次迭代的结果。在这种情况下,结果应该是这里提到的字典。我知道我想要的字符串是结果字典的第二个值。当打印结果字典时,我实际上可以看到它。所以你说的是直到:所有系统进入项目['stdout'],我可以捕获结果字典的第二个值?因为我要查找的值在dictionary中,因为我的命令在循环中。我是说它将在循环的当前迭代中捕获它,项[stdout]将在循环中的每次迭代中重新注册和更新。因此,您是说直到:所有系统进入项['stdout'],我可以捕获结果dictionary的第二个值吗?因为我要查找的值在字典中,因为我的命令在循环中。我的意思是它将在循环的当前迭代中捕获它,所以项目[stdout]将在循环的每个迭代中重新注册和更新。