如何在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]将在循环的每个迭代中重新注册和更新。