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
40
demandé sur augurar 2015-02-26 00:06:07

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.

35
répondu Strahinja Kustudic 2017-01-07 20:07:31

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.

11
répondu augurar 2015-03-05 21:59:23

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.

2
répondu almightyData 2015-03-06 08:40:56

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!

0
répondu Michael Loo 2017-05-23 12:17:30

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
-1
répondu udondan 2015-02-26 00:03:54

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.

-1
répondu Ben.12 2016-08-26 15:14:09