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