#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 (для 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