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
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.
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
.
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.
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!