Aller au contenu

Ansible et l'idempotence

Ansible

Objectif de cet atelier pratique

  • Intégrer par la pratique le concept d'idempotence

C'est quoi l'idempotence ?

L'idempotence est une des principales caractéristiques d'Ansible. C'est ce qui fait sa force par rapport à des méthodes de configuration plus traditionnelles comme les scripts shell.

Le terme d'idempotence nous vient des mathématiques. Dans ce contexte, il désigne une fonction que l'on peut exécuter une seule fois ou autant de fois que l'on veut, on obtient toujours le même résultat. C'est une propriété à laquelle Ansible attache énormément d'importance.

Pour un système de gestion de configuration, cela signifie plus concrètement que lorsqu'un certain état de la configuration est atteint, il s'agit de le maintenir. Toutes les exécutions subséquentes des instructions seront sans effet.

Si c'est encore un peu trop abstrait à votre goût, prenons quelques exemples :

  • Un paquet logiciel doit être installé. La première invocation s'en charge. Les invocations subséquentes ne font que constater qu'il n'y a plus rien à faire.

  • Un fichier de configuration contient déjà la ligne souhaitée – il ne reste plus rien à faire.

  • Un lien symbolique est déjà présent sur le système – il ne reste plus rien à faire.

  • Un utilisateur fait déjà partie d'un groupe – il ne reste plus rien à faire.

Démarrer le labo

Voyons voir cela de plus près. Placez-vous dans le répertoire du septième atelier pratique :

$ cd ~/formation-ansible/atelier-07

Voici les quatre machines virtuelles de cet atelier :

Machine virtuelle Adresse IP
ansible 192.168.56.10
rocky 192.168.56.20
debian 192.168.56.30
suse 192.168.56.40

Démarrez les VM :

$ vagrant up

Connectez-vous au Control Host :

$ vagrant ssh ansible

L'environnement de cet atelier est préconfiguré et prêt à l'emploi :

  • Ansible est installé sur le Control Host.

  • Le fichier /etc/hosts du Control Host est correctement renseigné.

  • L'authentification par clé SSH est établie sur les trois Target Hosts.

  • Le répertoire du projet existe et contient une configuration de base et un inventaire.

Rendez-vous dans le répertoire du projet :

$ cd ansible/projets/ema/
$ ls
ansible.cfg  inventory

Créer et recréer un utilisateur

Je crée l'utilisateur greg sur la machine rocky :

$ ansible rocky -m user -a "name=greg shell=/bin/bash"
rocky | CHANGED => {
    "changed": true,
    "comment": "",
    "create_home": true,
    "group": 1001,
    "home": "/home/greg",
    "name": "greg",
    "shell": "/bin/bash",
    "state": "present",
    "system": false,
    "uid": 1001
}

Observez ce qui se passe lorsque je relance exactement la même commande :

$ ansible rocky -m user -a "name=greg shell=/bin/bash"
rocky | SUCCESS => {
    "append": false,
    "changed": false,
    "comment": "",
    "group": 1001,
    "home": "/home/greg",
    "move_home": false,
    "name": "greg",
    "shell": "/bin/bash",
    "state": "present",
    "uid": 1001
}
  • Au premier lancement du module user, le résultat s'affiche en orange (ou plus exactement en taupe, merci à Julie Chevallier pour la précision) et la valeur de changed est true.

  • Le deuxième lancement est sans effet, puisque l'utilisateur greg existe déjà. Le résultat s'affiche en vert et la valeur de changed est false.

À vous de jouer !

Pour vous familiariser avec la notion d'idempotence, exécutez une série de tâches administratives sur toutes les machines cibles. Pour ce faire, servez-vous des commandes ad hoc que nous avons vues dans le précédent atelier pratique. Prenez soin d'exécuter chaque commande deux fois et observez ce qui se passe dans l'affichage du résultat.

  • Installez successivement les paquets tree, git et nmap sur toutes les cibles.

  • Désinstallez successivement ces trois paquets en utilisant le paramètre supplémentaire state=absent.

  • Copiez le fichier /etc/fstab du Control Host vers tous les Target Hosts sous forme d'un fichier /tmp/test3.txt.

  • Supprimez le fichier /tmp/test3.txt sur les Target Hosts en utilisant le module file avec le paramètre state=absent.

  • Enfin, affichez l'espace utilisé par la partition principale sur tous les Target Hosts. Que remarquez-vous ?