Используя Ansible, есть ли способ вытащить другой образ докера, если он выдает ошибку 404? - PullRequest
0 голосов
/ 04 февраля 2019

Я хочу реализовать решение, в котором, если одно изображение докера не может быть извлечено из-за того, что оно не существует, вместо этого вытягивается другое изображение.

 - name: Pull an image
   docker_image:
     name: repository:stable
   with_list: "{{ repository }}"

Например, обычно, если изображение стег stable не существует, выбрасывается 404 Client Error: Not Found, есть ли способ отловить эту ошибку и вытащить хранилище: вместо этого последний?Или возможный обходной путь для извлечения второго, если первое не существует?

Я также использую это для извлечения многих изображений докеров из списка репозиториев.

Любая помощь по этому вопросу будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Основная проблема заключалась в том, что сообщение об ошибке, возвращаемое из block, состоит из набора массивов.Где каждый массив соответствует сообщению об ошибке этого выполнения.

Поэтому я не мог использовать in, так как он искал точное значение соответствия для свойства, но свойство было вложено в массив.К счастью, в родительском объекте было еще одно логическое свойство, которое предоставило мне информацию, поэтому я использовал вместо нее ключ failed.failed имеет значение true, когда извлечение образа докера не удалось.

- 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, которая относится к элементу в dict, который имеет Failed: true.

0 голосов
/ 05 февраля 2019

Вы можете использовать обработку ошибок 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
...