TP 7 (interactif) : Provisionner des comptes sur plusieurs conteneurs live

Objectif

Écrire un playbook complet qui crée plusieurs comptes, leurs groupes, distribue leurs clés SSH et accorde des droits sudo ciblés, en une seule exécution sur toute la flotte — puis observer l’idempotence en le rejouant.

Environnement disponible

Vous disposez de :

  • 1 serveur de contrôle avec Ansible installé
  • 2 clients Debian
    • nrd-web1
    • nrd-db1

Informations de connexion

  • Utilisateur : root
  • Mot de passe : formation

⚠️ Les conteneurs de ce lab repartent de zéro à chaque session. Les premières étapes ci-dessous refont donc systématiquement tout le bootstrap.

Ce que vous allez réaliser

  1. Installer Ansible
  2. Générer une clé SSH pour le nœud de contrôle et la déployer sur les deux clients
  3. Localiser les IP et créer l’inventaire
  4. Générer une clé SSH dédiée pour chacun des deux nouveaux employés (Alice, Bob)
  5. Écrire un playbook qui, en une seule exécution :
    • crée le groupe support
    • crée les comptes alice et bob, rattachés à ce groupe
    • déploie la clé publique de chacun
    • accorde à alice un droit sudo ciblé (redémarrer Apache uniquement)
  6. Exécuter le playbook, puis le rejouer pour observer l’idempotence
  7. Vérifier qu’Alice peut se connecter avec sa propre clé, sans mot de passe

Conseils

  • Utilisez loop avec une liste de dictionnaires pour créer les deux comptes en une seule tâche, plutôt que de dupliquer les tâches.
  • N’oubliez pas validate: "visudo -cf %s" sur le fichier sudoers — une erreur de syntaxe non détectée pourrait bloquer sudo sur toute la machine.
  • Le mot de passe des nouveaux comptes n’est pas traité dans ce TP (on le fera proprement avec Vault en section 8) — seule la connexion par clé est mise en place ici.

🧪 Lab · membre

🧪 Démarrer — 30 min
Voir la solutionMasquer la solution

Générer la clé SSH du nœud de contrôle et la déployer sur les deux clients

ssh-keygen -t ed25519 -C "ansible@control-serveur" -f ~/.ssh/id_ed25519 -N ""

ssh root@nrd-web1
nano .ssh/authorized_keys
# Coller la clé publique, sauvegarder

ssh root@nrd-db1
nano .ssh/authorized_keys
# Coller la même clé publique, sauvegarder

Localiser les IP et créer l’inventaire

ping nrd-web1
ping nrd-db1

mkdir -p ansible/files && cd ansible
nano inventaire.yaml
# inventaire.yaml
all:
  hosts:
    nrd-web1:
      ansible_host: <IP>
    nrd-db1:
      ansible_host: <IP>
ansible all -i inventaire.yaml -m ping

Générer une clé SSH dédiée pour Alice et Bob (simule leurs propres clés personnelles)

ssh-keygen -t ed25519 -C "alice@nordika" -f files/alice_id_ed25519 -N ""
ssh-keygen -t ed25519 -C "bob@nordika" -f files/bob_id_ed25519 -N ""

Seules les clés publiques (.pub) seront utilisées dans le playbook — les clés privées resteraient en pratique sur les postes respectifs d’Alice et Bob.

Écrire le fichier sudoers pour Alice

nano templates_sudoers_alice.j2
# templates_sudoers_alice.j2
alice ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart apache2

Écrire le playbook complet

nano playbook_onboarding.yaml
# playbook_onboarding.yaml
---
- name: Provisionner les nouveaux employés de Nordika
  hosts: all
  become: yes

  tasks:
    - name: Créer le groupe support
      ansible.builtin.group:
        name: support
        state: present

    - name: Créer les comptes des nouveaux employés
      ansible.builtin.user:
        name: "{{ item.nom }}"
        state: present
        create_home: yes
        groups: support
        append: yes
      loop:
        - { nom: "alice", cle: "alice_id_ed25519.pub" }
        - { nom: "bob", cle: "bob_id_ed25519.pub" }
      loop_control:
        label: "{{ item.nom }}"

    - name: Déployer la clé publique de chacun
      ansible.posix.authorized_key:
        user: "{{ item.nom }}"
        state: present
        key: "{{ lookup('file', 'files/' + item.cle) }}"
      loop:
        - { nom: "alice", cle: "alice_id_ed25519.pub" }
        - { nom: "bob", cle: "bob_id_ed25519.pub" }
      loop_control:
        label: "{{ item.nom }}"

    - name: Donner à Alice le droit de redémarrer Apache uniquement
      ansible.builtin.template:
        src: templates_sudoers_alice.j2
        dest: /etc/sudoers.d/alice
        validate: "visudo -cf %s"
        owner: root
        group: root
        mode: "0440"

Première exécution

ansible-playbook playbook_onboarding.yaml -i inventaire.yaml -v

Vous devriez voir changed sur toutes les tâches, pour les deux hôtes.

Rejouer le playbook pour observer l’idempotence

ansible-playbook playbook_onboarding.yaml -i inventaire.yaml -v

changed=0 partout : les comptes, groupes, clés et droits sudo étaient déjà en place, Ansible n’a rien eu besoin de refaire.

Vérifier la connexion d’Alice sans mot de passe

ssh -i files/alice_id_ed25519 alice@nrd-web1

Vous devriez vous connecter directement, sans qu’aucun mot de passe ne soit demandé — la clé publique déployée par Ansible fait foi.