Ecrire du code ansible correctement
Mise à jour :
Lorsqu’on écrit des playbooks et des rôles Ansible, comme pour tous les langages de programmation, il y a un certain nombre de bonnes pratiques et de règles à respecter pour obtenir un code de qualité. A moins de faire toujours la même chose, il est difficile de connaître toutes ces règles. C’est là qu’interviennent les outils de linting. Ansible-Lint va vous permettre de contrôler le respect de toutes ces règles et d’éviter les pièges courants sur vos playbooks, vos rôles et même les collections. Ansible-lint va également vous aider à mettre à niveau votre code pour qu’il continue de fonctionner lors des sorties des nouvelles versions d’Ansible.
Le projet Ansible Galaxy utilise Ansible-Lint pour calculer les scores de qualité des codes déposés dans le Galaxy Hub.
Installation d’Ansible Lint
Comme Ansible, l’outil ansible-lint est écrit en python et donc son installation se fait via pip ou pix (mon préféré car indépendant de la version d’ansible).
On va l’installer avec yamllint
.
Dans le cas où vous utilisez encore d’anciennes versions d’Ansible, il est possible de choisir une version du linter compatible avec celle-ci.
Que contrôle ansible lint?
Par défaut cet outil permet de contrôler en autre :
- l’utilisation
command
oushell
plutôt qu’un module existant prenant en charge cette commande - l’utilisation
command
plutôt queshell
(si le module équivalent n’existe pas) - le bon respect des espaces dans les noms de variables : {{ my_variable }} et non {{my_variable}}
- la présence de
local_action
qui doit être remplacé pardelegate_to: localhost
- l’utilisation de modules dépréciés
- les tests de chaînes de caractères de longueur nulle: when:
var|length > 0
- l’utilisation du nom complet pour les modules
ansible.builtin
(depuis la version 3.0 d’ansible) - l’utilisation de
failed_when
avec ses conditions d’erreurs plutôt queignore_errors
- l’utilisation des FQCN : Full Qualified Collection Names
- …
La liste complète avec leurs explications ↗
Pour afficher toutes les règles utilisées par défaut, il suffit de taper la commande suivante :
Pour limiter les tests sur certaines règles, il suffit d’utiliser l’option -t
.
Par exemple pour lancer un contrôle sur juste l’idempotence :
De la même manière pour exclure certaines règles :
On peut plutôt que de les ignorer les afficher en warning:
Ansible-Lint par la pratique
Prenons ce playbook par exemple :
qui retourne :
Que faut-il faire pour qu’ansible-lint ne retourne pas d’erreurs ?
- Mettre des majuscules à la première lettre de la description
- Ajouter à la ligne 2
name: UMn playbook
- A la ligne 3 remplacer
no
parfalse
- A la ligne 9 on doit ajouter
changed_when
pour indiquer à Ansible quand la commande utilisée va réellement changer quelque chose sur votre machine cible. - A la ligne 10 remplacer le module git par son propre module !!!
- Pour que l’on respecte les règles d’idempotence, il est important de ne pas
utiliser
default
mais de nommer une version explicite.
Si on souhaite forcer certaines règles, il est possible d’ajouter des arguments au playbook :
- Pour les autres modules, on peut skipper le test en ajoutant le tag
skip_ansible_lint
:
On peut, comme l’indique la commande, créer un fichier .ansible-lint
contenant
par exemple :
Mais je n’aime pas trop cela, car dans ce cas ce sont toutes les erreurs de ce type qui sont ignorées.
Ansible-lint apporte certaines corrections tout seul
Introduit avec la version 6.0.0
, ansible-lint permet désormais d’apporter certaines corrections à votre place avec l’option --write
:
- L’utilisation des FQCN : fqcn
- La première lettre de la description en capitale : name
- les valeurs booléenes à
true
oufalse
: yaml
Cette option s’enrichit au fil de la sortie des versions.
Utilisation de l’option —write
Cette option prend une valeur qui peut être all
, none
ou une liste des id de règles à corriger séparés par des virgules.
Si on reprend notre fichier exemple ci-dessus et que nous voulons corriger la capitalisation :
Cela nous donne ce résultat :
ansible-lint
a corrigé les fqcn manquants !!!
Écrire ses propres règles Ansible-Lint
Il est possible de créer ses propres règles et de les utiliser avec l’option -r /path/to/custom-rules
.
Pour la syntaxe des règles il suffit de se rendre sur cette page : custom-rules ↗
Si on veut les utiliser conjointement avec les règles par défaut, on remplace
-w
par -W
.
La suite
Il ne vous reste plus qu’à l’intégrer à votre ci !!
Deux alternatives ansible-later et spotter, qui est celui qui donne le plus de recommendations sur l’amélioration de votre code Ansible.