Пропустить Невозможную задачу при запуске в режиме проверки?
Я пишу пьесу Ansible и выполняю задачу, которая всегда будет работать в режиме проверки:
hosts: ...
tasks:
- set_fact: filename="{{ansible_date_time.iso8601}}"
- file: state=touch name={{filename}}
- file: state=link src={{filename}} dest=latest
В режиме проверки файл не будет создан, поэтому задача link
всегда будет работать. Есть ли способ отметить такую задачу, которую нужно пропустить при запуске в режиме проверки? Что-то вроде:
- file: state=link src={{filename}} dest=latest
when: not check_mode
Ответы
Ответ 1
Ansible 2.1 поддерживает магическую переменную ansible_check_mode
, которая установлена в True
в режиме проверки (официальных документов). Это означает, что вы сможете это сделать:
- file:
state: link
src: '{{ filename }}'
dest: latest
when: not ansible_check_mode
или
- file:
state: link
src: '{{ filename }}'
dest: latest
ignore_errors: '{{ ansible_check_mode }}'
в зависимости от того, что вам больше нравится.
Ответ 2
Вот своего рода хакерское решение:
hosts: ...
tasks:
- command: /bin/true
register: noop_result
- set_fact: check_mode={{ noop_result|skipped }}
- set_fact: filename="{{ansible_date_time.iso_8601}}"
- file: state=touch name={{filename}}
- file: state=link src={{filename}} dest=latest
when: not check_mode
В режиме проверки задача command
будет пропущена, поэтому check_mode
будет установлено на true
. Если не в режиме проверки, задача всегда должна быть успешной, а check_mode
- false
.
Ответ 3
У меня была такая же ситуация с unarchive
:
unarchive
не работает в режиме проверки, если архив не существует, а также если целевой каталог не существует (оба выполняются в шагах до unarchive
).
Я решил эту проблему, установив always_run: true
на этапы подготовки, чтобы они также выполнялись в режиме проверки:
---
- name: create artifact directory
file: {{ artifact_dest_dir }} state=directory
always_run: true
- name: download artifact on the remote host
get_url:
url={{ artifact_url }}
dest={{ artifact_dest_dir }}/{{ artifact_filename }}
force=yes
always_run: true
- name: unpack build artifact
unarchive: src={{ artifact_dest_dir }}/{{ artifact_filename }}
dest={{ artifact_dest_dir }}
copy=no
Это работает в моем случае, но с каталогами, зависящими от времени, это может быть не лучшим решением.
Ответ 4
Хотя уже есть принятый ответ, я хотел бы упомянуть, что решение, упомянутое augurar не работал у меня, так как я продолжал получать следующую ошибку: skipped expects a dictionary
То, что закончилось для меня, было немного менее хакерским решением, передав и добавив переменную с флагом -e
следующим образом:
# On the terminal
ansible-playbook [...] --check -e '{"check_mode":true}'
# In the playbook or role
when: [...] and not check_mode
# In the proper `group_vars/` file
check_mode: false
Позвольте мне знать, что вы, ребята, думаете!
Ответ 5
Вероятно, вы могли бы просто установить when: filename is defined
для всех задач. Недостатком является то, что вы не можете выйти из строя в нормальном режиме, если filename
не будет определен.
hosts: ...
tasks:
- set_fact: filename="{{ansible_date_time.iso_8601}}"
- file: state=present name={{filename}}
when: filename is defined
- file: state=link src={{filename}} dest=latest
when: filename is defined
Ответ 6
Другие параметры, которые необходимо знать, это теги или параметр --step
.
Метки
tasks:
- set_fact: filename="{{ansible_date_time.iso8601}}"
- file: state=touch name={{filename}}
- file: state=link src={{filename}} dest=latest
tags:
- test
Тогда используемая команда Ansible будет:
ansible-playbook example.yml --skip-tags "test" --check
Существуют и другие примеры для пропуска/задания задач, которые вы хотели бы запускать с помощью тегов в Документация Ansible tags.
Начало и шаг
Ansible также обеспечивает приятный пошаговый режим отладки с опцией --step
.
Запуск ansible-playbook example.yml --step --check
интерактивно проведет вас по каждой задаче в вашей playbook
В разделе "Начало и шаг" Документация Ansible:
Это приведет к невозможности остановки каждой задачи и спросит, должна ли она выполнять эту задачу. Предположим, что у вас была задача "configure ssh", запуск программы воспроизведения останавливается и спрашивает:
Perform task: configure ssh (y/n/c):
Ответ "y" выполнит задачу, ответ "n" пропустит задачу, а ответ "c" продолжит выполнение всех оставшихся задач без запроса.