Molecule & Docker#

À savoir

Pour réaliser vos tests de rôles Ansible avec Molecule et Docker, vous allez devoir commettre une hérésie.

Vous trouverez dans tous les bon tutoriels sur Docker qu’il est contre-nature de faire démarrer un conteneur avec systemd ou un autre service manager comme processus principal. C’est ce que vous allez devoir faire si vous testez des rôles qui mettent en place des services systèmes (spoiler : c’est le cas 90% du temps).

Prérequis#

Initialisation#

Pour démarrer avec Molecule :

  • Placez vous à la racine du rôle que vous souhaitez tester :

$ pwd 
/home/user/ansible-workspaces/ultimate/training

$ cd roles

$ molecule init role molecule_docker_demo --driver-name docker

$ cd molecule_docker_demo

$ tree -a molecule/
molecule/
└── default
    ├── converge.yml
    ├── molecule.yml
    └── verify.yml

1 directory, 3 files

On peut voir que la commande d’init a créé un répertoire molecule/default/ et plusieurs fichiers :

molecule.yml

fichier de configuration des environnements de test et des options molecule pour ce scénario.

converge.yml

playbook qui sera appliqué aux environnements de test

verify.yml

playbook qui sera joué pour vérifier que converge.yml a bien effectué les modifications attendues.

Configuration#

Allez modifier le fichier molecule/default/molecule.yml pour qu’il ressemble à ceci :

---
driver:
  name: docker
platforms:
  - name: debian
    image: "ultimate:11"
    pre_build_image: false
    pull: false
    privileged: true
provisioner:
  name: ansible
verifier:
  name: ansible

Construire son conteneur cible#

Pour que Molecule prenne en charge la construction du conteneur qui sert de machine cible, créez un template de Dockerfile au chemin par défaut pour le scénario, molecule/default/Dockerfile.j2, avec ce contenu :

#
# TEST-ONLY Dockerfile, NE PAS DEPLOYER
#
ARG DEBIAN_TAG=11-slim
FROM debian:$DEBIAN_TAG
ARG DEBIAN_FRONTEND=noninteractive
RUN set -eux; \
  apt-get update && apt-get upgrade && apt-get dist-upgrade; \
  apt-get install --no-install-recommends -y apt-utils \
  curl ca-certificates sudo \
  python python3 python3-apt locales \
  systemd systemd-sysv libpam-systemd dbus dbus-user-session; \
  localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8; \
  localedef -i fr_FR -c -f UTF-8 -A /usr/share/locale/locale.alias fr_FR.UTF-8
ENV LANG fr_FR.utf8
RUN rm -f /lib/systemd/system/multi-user.target.wants/* \
  /etc/systemd/system/*.wants/* \
  /lib/systemd/system/local-fs.target.wants/* \
  /lib/systemd/system/sockets.target.wants/*udev* \
  /lib/systemd/system/sockets.target.wants/*initctl* \
  /lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup* \
  /lib/systemd/system/systemd-update-utmp*
ENTRYPOINT ["/lib/systemd/systemd"]

Nous construisons volontairement un conteneur qui démarre avec systemd pour pouvoir tester la mise en place de services système avec Ansible.

Coder le comportement du rôle#

Nous allons maintenant remplir les tasks de notre rôle de test dans tasks/main.yml :

---
#
# roles/molecule_docker_demo/tasks/main.yml
#
- name: Installation de sshd
  apt:
    name: openssh-server
    update_cache: yes

- name: Activation de sshd
  service:
    name: sshd
    state: started
    enabled: true

Coder le playbook de test#

Enfin nous remplissons le fichier molecule/default/verify.yml avec des tasks qui devront valider l’état de notre machine de test :

---
- name: Verify
  hosts: all
  gather_facts: false
  tasks:
    - name: Activation de sshd
      service:
        name: sshd
        state: started
        enabled: true
      register: sshd_service_status

    - name: Sshd est actif et démarré
      assert:
        that:
          - sshd_service_status is not changed

Lancement#

Depuis le répertoire de notre rôle à tester, lancez la commande :

$ pwd 
/home/user/ansible-workspaces/ultimate/training/roles/molecule_docker_demo

$ molecule test
INFO     default scenario test matrix: dependency, lint, cleanup, destroy, syntax, create, prepare, converge, idempotence, side_effect, verify, cleanup, destroy
INFO     Performing prerun...
[...]
Wait for instance(s) deletion to complete ------------------------------- 5.34s
Destroy molecule instance(s) -------------------------------------------- 0.32s
Delete docker networks(s) ----------------------------------------------- 0.02s
INFO     Pruning extra files from scenario ephemeral directory

Le workflow complet peut prendre un peu de temps à tourner pour le premier lancement (construction du conteneur oblige).

Si molecule test s’exécute sans erreur, notre test est valide.

Ligne d’arrivée#

Félicitations, vous venez d’effectuer votre premier test de rôle Ansible avec Molecule et le driver Docker. Vous pouvez extrapoler vos propres suites de tests à partir ce premier exemple basique.