Подтвердить что ты не робот

Пропустить Невозможную задачу при запуске в режиме проверки?

Я пишу пьесу 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
4b9b3361

Ответ 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" продолжит выполнение всех оставшихся задач без запроса.