我想实现一个解决方案,如果一个泊坞窗映像由于不存在而无法被拉出,则改为拉另一个泊坞窗。
- name: Pull an image
docker_image:
name: repository:stable
with_list: "{{ repository }}"
例如,通常,如果标记为stable
的图像不存在,则抛出404 Client Error: Not Found
,是否有办法捕获此错误并拉存储库:最新?还是可能的解决方法,如果不存在第二种方法,则可以拉第二种方法。
我还使用它从存储库列表中提取许多docker映像。
在此问题上的任何帮助将不胜感激。
答案 0 :(得分:2)
您可以使用错误处理block
来捕获这种情况,如果您使用Ansible 2.1+,则新的ansible_failed_result
变量也将使检查失败任务的结果更加容易。
如果您需要对失败执行多个任务操作,我会尝试这样的操作:
- block
- name: Pull an image
docker_image:
name: repository:stable
with_list: "{{ repository }}"
rescue:
- name: Do some etc parsing to determine the issue
set_fact:
pull_latest: '{{ "404" in ansible_failed_result }}'
- name: Pull second image
docker_image:
name: repository:latest
when: pull_latest
答案 1 :(得分:0)
潜在的问题是从block
返回的错误消息由数组字典组成。每个数组对应于该执行的错误指令。
因此,我无法使用in
,因为这是在属性上搜索精确匹配值,但是该属性嵌套在数组中。幸运的是,父对象上还有一个布尔属性为我提供了信息,所以我改用了failed
键。码头工人镜像拉取失败时,failed
为真。
- block:
- name: Pull an image
docker_image:
name: repository:stable
with_list: "{{ repositories }}"
loop_control:
loop_var: repository
rescue:
- name: Pull latest-dev image
docker_image:
name: repository:latest
when: ansible_failed_result.failed
with_list: "{{ repositories }}"
loop_control:
loop_var: repository
主行是ansible_failed_result.failed
,它是指字典中具有Failed: true
的元素。