Ignorer une tâche Ansible lors de l'exécution en mode check?
J'écris un playbook Ansible et j'ai une tâche qui échouera toujours en mode check:
hosts: ...
tasks:
- set_fact: filename="{{ansible_date_time.iso8601}}"
- file: state=touch name={{filename}}
- file: state=link src={{filename}} dest=latest
En mode check, le fichier ne sera pas créé, donc 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 check? Quelque chose comme:
- file: state=link src={{filename}} dest=latest
when: not check_mode
6 réponses
Ansible 2.1 prend en charge ansible_check_mode
variable magique qui est définie sur True
en mode check (documents officiels). Cela signifie que vous serez en mesure de 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 check, la tâche command
sera ignorée, donc check_mode
sera définie sur true
. Lorsqu'elle n'est pas en mode check, la tâche doit toujours réussir et check_mode
sera réglé sur false
.
J'ai eu le même genre de situation avec unarchive
:
unarchive
échoue en mode check si l'archive n'existe pas et aussi si le répertoire de destination n'existe pas (les deux sont effectués dans les étapes précédant unarchive
).
J'ai résolu ce problème en définissant always_run: true
aux étapes de préparation afin qu'elles soient également exécutées en mode check:
---
- 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 les 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 je continuais à avoir l'erreur suivante: skipped expects a dictionary
Ce qui a fini par fonctionner pour moi était une solution légèrement moins hacky en passant et variable supplémentaire avec le drapeau -e
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
Faites-moi savoir ce que vous en pensez!
Vous pourriez probablement simplement définir un when: filename is defined
pour toutes les tâches. Inconvénient, vous ne pouvez pas échouer en mode normal si filename
ne serait pas défini.
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
Les autres options à connaître sont les balises ou l'option --step
.
Les Balises
tasks:
- set_fact: filename="{{ansible_date_time.iso8601}}"
- file: state=touch name={{filename}}
- file: state=link src={{filename}} dest=latest
tags:
- test
Alors la commande Ansible à utiliser serait:
ansible-playbook example.yml --skip-tags "test" --check
Il existe d'autres exemples pour ignorer/spécifier les tâches que vous souhaitez exécuter en utilisant des balises dans la documentation Ansible tags .
Démarrer et Étape
Ansible fournit également un bon mode de débogage étape par étape avec l'option --step
.
L'Exécution de ansible-playbook example.yml --step --check
interactivement prendre vous à travers chaque tâche dans votre playbook
De la section" Démarrer et étape "de la documentation Ansible :
Cela entraînera l'arrêt d'ansible sur chaque tâche et lui demandera s'il doit exécuter cette tâche. Disons que vous aviez une tâche appelée "configurer ssh" , l'exécution du playbook s'arrêtera et demandera:
Perform task: configure ssh (y/n/c):
Répondre à " y "exécutera la tâche, répondre à" n "ignorera la tâche, et répondre à" c " continuera à exécuter toutes les tâches restantes sans demander.