Ansible循环任务中单条失败时如何获取所有条目执行结果?
Ansible HTTP重定向检查任务调整方案
问题根因
默认配置下Ansible只要有任务执行失败,就会终止后续所有任务的运行。你的第一个重定向检查任务只要有一个循环项满足failed_when规则被标记为失败,整个任务就会判定为失败,后续的打印任务自然不会执行。
解决方法
方法1:使用你找到的忽略错误配置
直接在第一个检查任务的failed_when: result.redirected is false行后追加ignore_errors: true即可,修改后即使检查任务有失败项,也会继续执行后续的打印任务,符合你预期的输出效果。
调整后的完整playbook代码如下:
--- - hosts: localhost tasks: - name: Check http redirect uri: url: "{{item}}" method: GET loop: - http://www.stackoverflow.com - http://www.twitter.com - http://www.example.com register: result failed_when: result.redirected is false ignore_errors: true - name: Print return information from the previous task ansible.builtin.debug: var: result.results[index].url loop: - http://www.stackoverflow.com - http://www.twitter.com - http://www.example.com loop_control: index_var: index
注意:原打印任务中的result.results[{{index}}].url写法有误,var参数本身处于Jinja2解析上下文,不需要额外加{{}}包裹index,已修正为result.results[index].url
方法2:直接提取所有重定向成功的URL
如果你不需要逐个打印结果,只想拿到所有重定向成功的URL列表,可以直接通过Jinja2过滤器从注册的result变量中过滤,不需要单独循环:
- name: 输出所有成功重定向的URL列表 ansible.builtin.debug: msg: "{{ result.results | selectattr('redirected', 'equalto', True) | map(attribute='url') | list }}"
这个任务会直接输出所有重定向成功的URL,不需要依赖循环索引。
内容的提问来源于stack exchange,提问作者sebelk
相关产品推荐
相关产品推荐

