web-dev-qa-db-fra.com

Ignorer la tâche Ansible lors de l'exécution en mode vérification?

J'écris un playbook Ansible et j'ai une tâche qui échouera toujours en mode vérification:

hosts: ...
tasks:
    - set_fact: filename="{{ansible_date_time.iso8601}}"
    - file: state=touch name={{filename}}
    - file: state=link src={{filename}} dest=latest

En mode vérification, le fichier ne sera pas créé, la tâche link échouera toujours. Existe-t-il un moyen de marquer une telle tâche à ignorer lors de l'exécution en mode vérification? Quelque chose comme:

- file: state=link src={{filename}} dest=latest
  when: not check_mode
43
augurar

Ansible 2.1 prend en charge ansible_check_mode variable magique définie sur True en mode vérification ( documents officiels ). Cela signifie que vous pourrez le faire:

- file:
    state: link
    src: '{{ filename }}'
    dest: latest
  when: not ansible_check_mode

ou

- file:
    state: link
    src: '{{ filename }}'
    dest: latest
  ignore_errors: '{{ ansible_check_mode }}'

celui que vous aimez le plus.

45
Strahinja Kustudic

Voici une sorte de solution hacky:

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

En mode vérification, la tâche command sera ignorée donc check_mode sera défini sur true. Lorsqu'elle n'est pas en mode vérification, la tâche doit toujours réussir et check_mode sera défini sur false.

11
augurar

J'ai eu le même genre de situation avec unarchive:

unarchive échoue en mode de vérification si l'archive n'existe pas et aussi si le répertoire de destination n'existe pas (tous deux effectués dans les étapes antérieures à unarchive). J'ai résolu ce problème en définissant always_run: true aux étapes de préparation pour qu'elles soient également exécutées en mode vérification:

---

- 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

Cela fonctionne dans mon cas, mais avec des répertoires dépendant du temps, cela pourrait ne pas être une bonne solution.

2
almightyData

Bien qu'il existe déjà une réponse acceptée , je voulais mentionner que la solution mentionnée par augurar ne fonctionnait pas pour moi car j'obtenais toujours l'erreur suivante: skipped expects a dictionary

Ce qui a fini par fonctionner pour moi était une solution un peu moins hacky en passant et variable supplémentaire avec le -e drapeau comme suit:

# 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

Dites-moi ce que vous en pensez!

0
Michael Loo