Ansible: запустить асинхронную задачу, в случае сбоя: запустить задачи очистки и повторить первую задачу x раз

#ansible

#ansible

Вопрос:

Я хотел бы создать программный поток, подобный этому:

 - name: Clone git repository
  block:
  - git:
      repo: "{{ project_gitlab_repository }}"
      dest: "{{ project_build_path }}"
    async: 120
    poll: 5
  rescue:
  - file:
      path: "{{ project_build_path }}"
      state: absent
  - ansible.builtin.command: /bin/false 
  retries: 3
  
  1. Попробуйте выполнить асинхронную задачу
  2. В случае сбоя запустите задачу очистки. (в этом случае удалите папку назначения)
  3. Вернитесь к шагу 1 (для x раз)

Приведенный выше код не работает, кажется, что вы можете повторить блоки. Возможно ли добиться чего-то подобного в Ansible?

Ответ №1:

Я решил эту проблему (хакерски), поместив следующий код в файл «clone_git_repository.yaml»

 - block:
  - name: Clone git repository
    git:
      repo: "{{ project_gitlab_repository }}"
      dest: "{{ project_build_path }}"
    async: 120
    poll: 5
  rescue:
  - set_fact:
      retry_count: "{{ 0 if retry_count is undefined else retry_count | int   1 }}"
  - fail:
      msg: maximum retries reached
    when: retry_count | int == 5
  - command: "rm -rf {{ project_build_path }}"
  - include_tasks: clone_git_repository.yml
  

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

Ответ №2:

К сожалению retry , не поддерживается для блоков. Я только что столкнулся с той же проблемой и придумал другой хакерский способ. Вместо использования модуля ansible git запустите его с помощью command модуля, и вы сможете решить повторную попытку в команде. Не очень приятно, но я все же предпочитаю этот способ, а не решение «include_task» (и в моем случае у меня уже было command заявление). Также, если вам нужно более 3-5 попыток, это становится довольно запутанным.

в вашем случае это будет выглядеть так:

 - name: Clone git repository
  block:
  - command: "git clone {{ project_gitlab_repository }} {{ project_build_path }} || 
              sleep 5 amp;amp;
              git clone {{ project_gitlab_repository }} {{ project_build_path }} ||
              sleep 20 amp;amp;
              git clone {{ project_gitlab_repository }} {{ project_build_path }}"
    async: 120
    poll: 5
  rescue:
  - file:
      path: "{{ project_build_path }}"
      state: absent
  - ansible.builtin.command: /bin/false