My Personal Wiki

La théorie, c'est quand on sait tout et que rien ne fonctionne.... La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

Outils pour utilisateurs

Outils du site


system:ansible:article

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

system/ansible/article.txt · Dernière modification : de sylvain

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki