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-web1nrd-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
- Installer Ansible
- Générer une clé SSH pour le nœud de contrôle et la déployer sur les deux clients
- Localiser les IP et créer l’inventaire
- Générer une clé SSH dédiée pour chacun des deux nouveaux employés (Alice, Bob)
- Écrire un playbook qui, en une seule exécution :
- crée le groupe
support - crée les comptes
aliceetbob, rattachés à ce groupe - déploie la clé publique de chacun
- accorde à
aliceun droit sudo ciblé (redémarrer Apache uniquement)
- crée le groupe
- Exécuter le playbook, puis le rejouer pour observer l’idempotence
- Vérifier qu’Alice peut se connecter avec sa propre clé, sans mot de passe
Conseils
- Utilisez
loopavec 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 minVoir 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.