Molecule est un outil développé à l'origine par retr0h et maintenant maintenu par Ansible/Red Hat qui automatise les tests des rôles Ansible.
En son cœur, Molecule est conçu pour automatiser toutes les parties du test de rôle:
Au lieu d'un processus hautement manuel, tester un rôle contre un certain nombre de distributions est aussi simple que d'exécuter : “molecule test”
Mais qu'en est-il du développement des rôles en premier lieu ?
Lorsque vous développez des rôles, vous souhaitez souvent que l'infrastructure se bloque après la fin de l'exécution de votre playbook afin que vous puissiez déterminer pourquoi quelque chose a échoué, ou que vous puissiez ré-exécuter le rôle rapidement après avoir apporté des modifications. Il s'avère que Molecule excelle également pour ce type de travail.
En supposant que vous avez déjà installé Ansible et Docker et que vous travaillez sur votre système, être opérationnel avec Molecule est très rapide et facile.
Molecule est disponible sous forme de package Python et peut être installé avec pip. Étant donné que cet exemple utilise Docker comme source d'infrastructure, le package docker-py est également requis:
$ pip install docker molecule
Ces commandes sont toutes exécutées par le test molécule, mais il est parfois pratique de les exécuter séparément.
Par exemple, lors de l'écriture des tests, ou lors du débogage de tests échoués.
Vous pouvez créer un nouveau rôle en exécutant : “molecule init role”:
$ molecule init role --driver-name docker oowy.redis INFO Initializing new role redis... Using /etc/ansible/ansible.cfg as config file - Role redis was created successfully localhost | CHANGED => {"backup": "","changed": true,"msg": "line added"} INFO Initialized role in /home/user/Cloud/gitlab/launcher/roles/redis successfully.
Molecule va créer un nouveau répertoire et le remplir avec le template Ansible et Molecule:
redis
├── README.md
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── molecule
│ └── default
│ ├── converge.yml
│ ├── molecule.yml
│ └── verify.yml
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
Les fichiers de rôle Ansible sont tous vides et le répertoire 'molecules' est plein de valeurs par défaut, mais il est déjà possible d'exécuter toutes les commandes.
Si vous exécutez un test de molécule en ce moment et que vous devriez voir une sortie similaire à ceci:
$ molecule test INFO default scenario test matrix: dependency, lint, cleanup, destroy, syntax, create, prepare, converge, idempotence, side_effect, verify, cleanup, destroy INFO Performing prerun with role_name_check=0... ... ...
La «test matrix» (ou «test sequence») montre tout ce que Molecule fera pour tester le rôle:
La tâche de convergence est la partie la plus importante de la matrice de test et vous pouvez voir ce que fait cette tâche en regardant molecule/default/playbook.yml:
# molecule/default/playbook.yml --- - name: Converge hosts: all roles: - role: redis
La commande “molecule test” peut prendre quelques minutes pour s'exécuter la première fois car il doit extraire et créer une image Docker, mais une fois que tout est fait, tout le reste devrait se terminer rapidement sans aucune erreur:
... --> Action: 'converge' PLAY [Converge] ************************************************************** TASK [Gathering Facts] ******************************************************* ok: [instance] PLAY RECAP ******************************************************************* instance : ok=1 changed=0 unreachable=0 failed=0 ... --> Executing Testinfra tests found in .../molecule/default/tests/... ============================= test session starts ============================ ... ========================== 1 passed in 10.46 seconds ========================= Verifier completed successfully. ...
Si vous avez déjà à disposition des roles ansible et que vous souhaitez ajouter la fonction de test unitaire avec molecule, il vous faudra utiliser cette commande :
$ molecule init scenario -r <ROLE_NAME> --driver-name docker --verifier-name ansible <NOM_DU_SCENARIO>
Exemple avec le role chrony déjà existant.
$ molecule init scenario -r chrony --driver-name docker --verifier-name ansible default INFO Initializing new scenario default... INFO Initialized scenario in /home/user/Cloud/gitlab/launcher/roles/chrony/molecule/default successfully.
Un scénario permet à Molecule de tester un rôle d'une manière particulière, c'est un changement fondamental par rapport à Molecule v1.
Un scénario est un répertoire autonome contenant tout ce qui est nécessaire pour tester le rôle. Le scénario par défaut est nommé default, et chaque rôle devrait contenir un scénario par défaut.
Sauf mention explicite, le nom du scénario sera le nom du répertoire hébergeant les fichiers.
Toute option définie dans cette section remplacera les valeurs par défaut.
scenario:
create_sequence:
- dependency
- create
- prepare
check_sequence:
- dependency
- cleanup
- destroy
- create
- prepare
- converge
- check
- destroy
converge_sequence:
- dependency
- create
- prepare
- converge
destroy_sequence:
- dependency
- cleanup
- destroy
test_sequence:
- dependency
- lint
- cleanup
- destroy
- syntax
- create
- prepare
- converge
- idempotence
- side_effect
- verify
- cleanup
- destroy
Pour passer en mode debug, il suffira d’ajouter l’argument –debug devant la sous-commande. Pour élever le niveau de debug vous pouvez utiliser cette commande :
ANSIBLE_DEBUG=true molecule converge -- -vvv
Depuis le passage de cgroup v1 à cgroupe v2 sur docker
# echo 'GRUB_CMDLINE_LINUX=systemd.unified_cgroup_hierarchy=false' > /etc/default/grub.d/cgroup.cfg # update-grub
PI :