From 1d9060d137312976e539fba8f73c67e49f5276de Mon Sep 17 00:00:00 2001 From: "l.covela" Date: Wed, 7 Jan 2026 11:53:25 +0100 Subject: [PATCH] Actualiser synology_upgrade_ssh.yml --- synology_upgrade_ssh.yml | 134 +++++++++++++++++++++++++++------------ 1 file changed, 93 insertions(+), 41 deletions(-) diff --git a/synology_upgrade_ssh.yml b/synology_upgrade_ssh.yml index 8a84131..a30d3f3 100644 --- a/synology_upgrade_ssh.yml +++ b/synology_upgrade_ssh.yml @@ -1,34 +1,86 @@ --- -- name: Synology DSM - télécharger puis installer une mise à jour via SSH (synoupgrade) +- name: Synology DSM - télécharger puis installer une mise à jour via SSH (auto-detect synoupgrade) hosts: synology gather_facts: false vars: - # Chemin habituel sur Synology - synoupgrade_bin: "/usr/syno/sbin/synoupgrade" - # Temps max (en secondes) pour attendre download / reboot download_timeout: 3600 - reboot_timeout: 1200 + reboot_timeout: 1800 poll_delay: 20 - # Certaines versions DSM n'ont pas exactement les mêmes options, - # on essaie plusieurs commandes possibles pour démarrer l'upgrade. - upgrade_start_cmds: - - "{{ synoupgrade_bin }} --start" - - "{{ synoupgrade_bin }} --upgrade" - - "{{ synoupgrade_bin }} --apply" - - "{{ synoupgrade_bin }} --run" - - "{{ synoupgrade_bin }} --install" + # Chemins probables (DSM varie selon versions/modèles) + synoupgrade_candidates: + - "/usr/syno/sbin/synoupgrade" + - "/usr/syno/bin/synoupgrade" + - "/sbin/synoupgrade" + - "/bin/synoupgrade" + - "/usr/bin/synoupgrade" + - "/usr/sbin/synoupgrade" + - "/usr/syno/sbin/synoupgrade2" + - "/usr/syno/bin/synoupgrade2" + - "/usr/bin/synoupgrade2" + - "/usr/sbin/synoupgrade2" + + # Commandes possibles pour lancer l’install (selon DSM) + start_subcommands: + - "--start" + - "--upgrade" + - "--apply" + - "--run" + - "--install" tasks: - - name: Vérifier que synoupgrade existe - ansible.builtin.raw: "test -x {{ synoupgrade_bin }} && echo OK || echo MISSING" - register: synoupgrade_exists - changed_when: false - failed_when: "'MISSING' in synoupgrade_exists.stdout" + # 0) Détecter le binaire présent + - name: Détecter synoupgrade (ou synoupgrade2) sur le NAS + ansible.builtin.raw: | + set -e + FOUND="" + for p in {{ synoupgrade_candidates | join(' ') }}; do + if [ -x "$p" ]; then + FOUND="$p" + break + fi + done - - name: Check mise à jour disponible (synoupgrade --check) + # fallback: PATH (busybox) + if [ -z "$FOUND" ]; then + if command -v synoupgrade >/dev/null 2>&1; then + FOUND="$(command -v synoupgrade)" + elif command -v synoupgrade2 >/dev/null 2>&1; then + FOUND="$(command -v synoupgrade2)" + fi + fi + + if [ -n "$FOUND" ]; then + echo "FOUND=$FOUND" + exit 0 + else + echo "FOUND=" + exit 0 + fi + register: detect + changed_when: false + + - name: Enregistrer le chemin synoupgrade détecté + ansible.builtin.set_fact: + synoupgrade_bin: "{{ (detect.stdout | regex_search('FOUND=(.*)', '\\1')) | default('') | trim }}" + changed_when: false + + - name: Fail si synoupgrade introuvable + ansible.builtin.fail: + msg: >- + synoupgrade introuvable sur ce NAS (DSM/ modèle). + stdout: {{ detect.stdout | default('') }} + => Donne-moi la sortie de : "ls -l /usr/syno/sbin /usr/syno/bin | grep -i upgrad" + when: synoupgrade_bin == "" + + - name: Afficher le binaire trouvé + ansible.builtin.debug: + msg: "synoupgrade utilisé: {{ synoupgrade_bin }}" + + # 1) Check mise à jour dispo + - name: Check mise à jour disponible ansible.builtin.raw: "{{ synoupgrade_bin }} --check || true" register: check_out changed_when: false @@ -37,16 +89,17 @@ ansible.builtin.debug: var: check_out.stdout_lines - # Heuristique : si "no update" / "no newer version" etc, on stop proprement. + # Heuristique : stop si rien - name: Stop si aucune mise à jour détectée (heuristique) ansible.builtin.meta: end_play when: > (check_out.stdout | lower) is search('no update') or (check_out.stdout | lower) is search('no newer') - or (check_out.stdout | lower) is search('already up') + or (check_out.stdout | lower) is search('already') or (check_out.stdout | lower) is search('up to date') - - name: Lancer le téléchargement (synoupgrade --download) + # 2) Download + - name: Lancer le téléchargement ansible.builtin.raw: "{{ synoupgrade_bin }} --download" register: download_start changed_when: true @@ -55,17 +108,15 @@ ansible.builtin.debug: var: download_start.stdout_lines - # Suivi du téléchargement : selon DSM, --status peut exister ou pas. - # On fait un poll best-effort sur --status, sinon on se base sur le log. + # 3) Attendre fin download (status ou log) - name: Attendre fin du téléchargement (poll status/log) ansible.builtin.raw: | set -e if {{ synoupgrade_bin }} --status >/dev/null 2>&1; then {{ synoupgrade_bin }} --status || true else - # fallback log courant (chemins variables selon DSM) - (tail -n 60 /var/log/synoupgrade.log 2>/dev/null || true) - (tail -n 60 /var/log/messages 2>/dev/null | grep -i synoupgrade || true) + (tail -n 80 /var/log/synoupgrade.log 2>/dev/null || true) + (tail -n 120 /var/log/messages 2>/dev/null | grep -i upgrad || true) fi register: dl_poll changed_when: false @@ -82,30 +133,31 @@ ansible.builtin.debug: var: dl_poll.stdout_lines - # Démarrage de l'upgrade : on teste plusieurs commandes. - - name: Démarrer l'installation DSM (essais multi-commandes) - ansible.builtin.raw: "{{ item }}" - loop: "{{ upgrade_start_cmds }}" + # 4) Démarrer installation (essais) + - name: Tenter de démarrer l'installation (plusieurs sous-commandes) + ansible.builtin.raw: "{{ synoupgrade_bin }} {{ item }} || true" + loop: "{{ start_subcommands }}" register: start_attempts changed_when: true failed_when: false - - name: Choisir la première commande start qui a l'air OK + - name: Choisir la première tentative qui ne ressemble pas à une erreur ansible.builtin.set_fact: start_ok: >- {{ (start_attempts.results - | rejectattr('stdout', 'search', '(?i)(invalid|unknown|usage|not found|error)') + | rejectattr('stdout', 'search', '(?i)(invalid|unknown|usage|not found|permission|error|failed)') + | rejectattr('stderr', 'search', '(?i)(invalid|unknown|usage|not found|permission|error|failed)') | list | first) | default({}) }} - - name: Fail si aucune commande start ne fonctionne + - name: Fail si aucune commande de démarrage ne marche ansible.builtin.fail: msg: >- Impossible de démarrer l'installation via synoupgrade. - Sorties: - {{ start_attempts.results | map(attribute='stdout') | list }} + stdout: {{ start_attempts.results | map(attribute='stdout') | list }} + stderr: {{ start_attempts.results | map(attribute='stderr') | list }} when: start_ok | length == 0 - name: Afficher la commande start retenue @@ -115,9 +167,8 @@ - "stdout: {{ start_ok.stdout | default('') }}" - "stderr: {{ start_ok.stderr | default('') }}" - # Beaucoup de Synology rebootent pendant/après l’upgrade. - # On attend que SSH tombe puis revienne. - - name: Attendre que le NAS coupe SSH (reboot en cours) + # 5) Attente reboot : le NAS peut couper SSH + - name: Attendre que le NAS coupe SSH (reboot probable) ansible.builtin.wait_for: host: "{{ inventory_hostname }}" port: 22 @@ -125,7 +176,7 @@ timeout: 300 delegate_to: localhost - - name: Attendre le retour SSH (après reboot) + - name: Attendre le retour SSH ansible.builtin.wait_for: host: "{{ inventory_hostname }}" port: 22 @@ -133,7 +184,8 @@ timeout: "{{ reboot_timeout }}" delegate_to: localhost - - name: Re-check version / statut après reboot (best effort) + # 6) Post-check + - name: Post-check version / statut ansible.builtin.raw: | uname -a || true cat /etc/VERSION 2>/dev/null || true