Ansible - le module assert peut tout controler !
Publié le : 26 avril 2022 | Mis à jour le : 11 décembre 2022Lors de l’exécution d’un playbook Ansible il peut parfois être nécessaire de
réaliser des contrôles de conformité avant d’exécuter d’autres actions. Par
exemple, avant de lancer un upgrade des packages sur une machine, il faut
vérifier qu’il y ait suffisamment de place sur la machine. C’est là
qu’intervient le module assert
. Trop souvent limité à la vérification de
variables dans les rôles assert
peut aussi être utilisé pour réaliser des
contrôles plus poussés au démarrage des playbooks.
Utilisation du module assert
Inutile de lancer un playbook complet pour le voir échouer à cause d’un bête manque de place sur un filesystem non ?
Il est tout à fait possible de lancer des contrôles sur la machine sans utiliser le module command. Je vais prendre comme exemple un check de l’espace disque du filesystem root :
---
- name: Playbook de test
hosts: all
become: true
gather_facts: true
vars:
max_rate_occupation_disk: 0.8
tasks:
- name: Check / usage
ansible.builtin.assert:
that:
- item.size_available > item.size_total|float * (1 - max_rate_occupation_disk/100)
when: item.mount == "/"
with_items:
- "{{ ansible_mounts }}"
Une boucle with_items
couplée à une condition vwhen
permet de limiter le
champ de test au seul filesystem root. Ici j’utilise les facts ansible
qui contient toutes sortes d’informations dont les filesystems. Bien sur, il ne
faut pas avoir désactivé la collecte de ces facts au démarrage du playbook !
Une autre solution pour limiter la collecte des facts au strict minimum est
le désactiver et faire appel ensuite appel au module setup en limitant la
collecte avec le paramètre gather_subset
:
---
- name: Playbook de test
hosts: all
become: true
gather_facts: false
tasks:
- name: collect facts
ansbile.builtin.setup:
gather_subset: !all,!min
- name: Check / usage
ansible.builtin.assert:
that:
- item.size_available > item.size_total|float * (1 - my_disk_slash_space_max/100)
when: item.mount == "/"
with_items:
- "{{ ansible_mounts }}"
Point important, pour éviter de recourir systématiquement au module
commande, je vous conseille d’utiliser les custom_facts
que je vous ai exposé
dans un précédent billet. En effet, il est possible d’utiliser un langage plus
évolué que du bash pour les créer. On peut tout imaginer !