Contenu

Tester que toutes les tâches Ansible shell sont bien en "failed == false"

Contenu

Il arrive que l’on veuille exécuter des commandes shell via Ansible (ou d’autres tâches), poursuivre temporairement l’exécution malgré les éventuelles erreurs /échecs mais, à la fin détecter/informer de toute erreur survenue.

Le paramètre ignore_errors permet de définir le comportement en cas d’erreur et un petit assert sur le résultat de la tâche permet de contrôler le tout.

Le bout de code Ansible suivant est un exemple qui mets en pratique cette construction :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
- name: Check if contrib and non-free are allowed for APT repositories
  ansible.builtin.shell: |
    grep -q "{{ item }}" /etc/apt/sources.list    
  register: __apt_sources_test
  loop:
    - contrib
    - non-free
  ignore_errors: true

- ansible.builtin.assert:
    that:
      - __apt_sources_test.results | map(attribute='failed') | intersect([true]) | length == 0
    fail_msg: Either contrib or non-free are not allowed for APT repositories
    success_msg: Both contrib and non-free are allowed for APT repositories.

La première tâche exécute plusieurs commandes Shell (de simples grep) via ansible.builtin.shell et continue en cas d’erreur (fichier inconnu, chaîne non trouvée, …) grâce à ignore_errors: true. Le résultat est enregistré dans la variable __apt_sources_test.

La deuxième tâche consulte cette variable, y cherche les résultats d’exécution (l’attribut booléen failed) pour vérifier qu’aucun n’est à true.