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éé pour que la tâche de link
échoue toujours. Existe-t-il un moyen de faire en sorte qu’une telle tâche soit ignorée lors de l’exécution en mode de vérification? Quelque chose comme:
- file: state=link src={{filename}} dest=latest when: not check_mode
Ansible 2.1 prend en ansible_check_mode
la variable magique ansible_check_mode
qui est définie sur True
en mode de 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 }}'
selon ce que vous aimez plus.
Voici une sorte de solution de piratage:
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 de vérification, la tâche de 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
est défini sur false
.
J’ai eu le même genre de situation avec unarchive
:
unarchive
échoue en mode vérification si l’archive n’existe pas et également si le répertoire de destination n’existe pas (les deux sont effectués dans les étapes précédant la 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 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 les répertoires dépendants 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 à recevoir l’erreur suivante: skipped expects a dictionary
Ce qui a fini par fonctionner pour moi était une solution légèrement moins pirate en passant et en ajoutant des variables 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
Dites-moi ce que vous en pensez!
Vous pourriez probablement définir un when: filename is defined
pour toutes les tâches. L’inconvénient est que vous ne pouvez pas échouer en mode normal si le filename
n’est 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
.
Mots clés
tasks: - set_fact: filename="{{ansible_date_time.iso8601}}" - file: state=touch name={{filename}} - file: state=link src={{filename}} dest=latest tags: - test
La commande Ansible à utiliser serait alors:
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 à l’aide de balises dans la documentation des balises Ansible .
Commencer et étape
Ansible fournit également un mode de débogage pas à pas avec l’option --step
.
Exécuter ansible-playbook example.yml --step --check
interactivement à travers chaque tâche de votre playbook
Dans la section “Démarrer et étape” de la documentation Ansible :
Cela provoquera l’arrêt d’ansible sur chaque tâche et demandera si elle doit exécuter cette tâche. Supposons que vous ayez une tâche appelée «configure ssh», l’exécution du jeu s’arrête et vous demandez:
Perform task: configure ssh (y/n/c):
Répondre à «y» va exécuter la tâche, répondre «n» sautera la tâche et répondre «c» continuera d’exécuter toutes les tâches restantes sans demander.