Table des matières
L'Automatisation & Orchestration Ansible
Prérequis
Il faut que sur tout les RPI soit installé python et avoir un accès SSH
Dans cet exemple tout les RPI on le même mot de passe root !!
Installation
Sur le poste de contôle :
sudo apt update sudo apt install -y ansible ansible --version
Arborescence projet
mkdir -p ~/ansible-pis/roles/maj_systeme/{tasks,handlers,defaults} cd ~/ansible-pis
Visuel Arbo
ansible-pis/ ├── ansible.cfg ← réglages globaux (Yubikey, sudo) ├── inventory.ini ← liste des RPi ou serveur ├── site.yml ← playbook principal (appelle le rôle) └── roles/ └── maj_systeme/ ← Rôles en question (ici pour les maj) ├── defaults/main.yml ← variables (options dpkg, etc.) ├── handlers/main.yml ← le redémarrage (déclenché au besoin) └── tasks/main.yml ← les tâches de mise à jour
Ansible.conf
cat > ansible.cfg << 'EOF' [defaults] inventory = ./inventory.ini host_key_checking = True interpreter_python = /usr/bin/python3 roles_path = ./roles [ssh_connection] # Multiplexing SSH : évite de retoucher la Yubikey à chaque tâche ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o ControlPath=/tmp/ansible-%r@%h:%p pipelining = true EOF
Inventory.ini
cat > inventory.ini << 'EOF' [pis] pi1 ansible_host=192.168.1.11 pi2 ansible_host=192.168.1.12 pi3 ansible_host=192.168.1.13 [pis:vars] ansible_user=pi ansible_python_interpreter=/usr/bin/python3 EOF
Rôle
cat > roles/maj_systeme/defaults/main.yml << 'EOF' --- # Options dpkg : conserve les fichiers de config existants # force-confdef → défaut du mainteneur si aucun choix explicite # force-confold → garde la version en cas de conflit dpkg_conf_options: 'force-confdef,force-confold' # Redémarrer automatiquement si le système le réclame autoriser_reboot: true EOF
Tâche du Rôle
cat > roles/maj_systeme/tasks/main.yml << 'EOF' --- - name: Mise à jour du cache APT ansible.builtin.apt: update_cache: yes cache_valid_time: 3600 - name: Upgrade complet en conservant les fichiers de config locaux ansible.builtin.apt: upgrade: dist dpkg_options: "{{ dpkg_conf_options }}" - name: Verifier si un redemarrage est requis par le systeme ansible.builtin.stat: path: /var/run/reboot-required register: reboot_requis notify: Redemarrer si necessaire - name: Nettoyage des paquets inutiles ansible.builtin.apt: autoremove: yes autoclean: yes - name: Reperer les fichiers de config en attente de fusion ansible.builtin.find: paths: /etc patterns: '*.dpkg-dist,*.dpkg-new,*.ucf-dist' recurse: yes register: conf_en_attente - name: Afficher les fichiers de config a examiner ansible.builtin.debug: msg: "Config a comparer manuellement : {{ conf_en_attente.files | map(attribute='path') | list }}" when: conf_en_attente.files | length > 0 EOF
Handler
Un handler est une tâche spéciale qui ne s'exécute que si elle est « notifiée »
cat > roles/maj_systeme/handlers/main.yml << 'EOF' --- - name: Redemarrer si necessaire ansible.builtin.reboot: msg: "Redemarrage apres mise a jour via Ansible" reboot_timeout: 300 when: - autoriser_reboot | bool - reboot_requis.stat.exists EOF
Le reboot ne se déclenchera que si /var/run/reboot-required est présent (typiquement après une mise à jour du noyau ou de certaines libs système).
Playbook
C'est le point d'entrée : il dit « applique le rôle maj_systeme sur le groupe pis »
cat > site.yml << 'EOF' --- - name: Mise a jour des Raspberry Pi hosts: pis become: true become_method: sudo roles: - maj_systeme EOF
Test de connexion
ansible pis -m ping
Tu dois avoir un retour similaire :
pi1 | SUCCESS => { "changed": false, "ping": "pong" } pi2 | SUCCESS => { "changed": false, "ping": "pong" } pi3 | SUCCESS => { "changed": false, "ping": "pong" }
Simulation à blanc (dry-run)
ansible-playbook site.yml --check --diff
ou
ansible-playbook site.yml -K --check --diff
Si sudo demande un password !!
Vérif autoremove
Plutôt que de tester paquet par paquet, regarde directement la liste réelle de ce qui serait supprimé (ça ne modifie rien) :
ansible pi1 -m command -a "apt-get --dry-run autoremove" --become
Repère dans la sortie les lignes commençant par Remv : ce sont les paquets qui partiraient. Si tu vois dans cette liste des choses que tu utilises, protège-les :
ansible pi1 -m command -a "apt-mark manual mariadb-server git" --become
(adapte les noms à ce que tu veux garder).
Deux façons de procéder :
Option prudente : Garder autoriser_autoremove: false pour cette première exécution.
On fait juste l'upgrade (qui préserve tes configs), sans rien supprimer.
Régler le tri manuel/auto tranquillement après.
Option directe : Lancer la vérification apt-get –dry-run autoremove ci-dessus sur les 3 RPi, protéger ce qui doit l'être, puis repasser autoriser_autoremove: true et faire tout d'un coup.
Lancer les mises à jour
ansible-playbook site.yml
Si tes RPi demande un mot de passe sudo, ajoute -K :
ansible-playbook site.yml -K
