diff --git a/synology_upgrade_ssh.yml b/synology_upgrade_ssh.yml index a30d3f3..a1f0b10 100644 --- a/synology_upgrade_ssh.yml +++ b/synology_upgrade_ssh.yml @@ -1,28 +1,23 @@ --- -- name: Synology DSM - télécharger puis installer une mise à jour via SSH (auto-detect synoupgrade) +- name: Synology DSM - télécharger puis installer une mise à jour via SSH (robuste Semaphore) hosts: synology gather_facts: false vars: - # Temps max (en secondes) pour attendre download / reboot download_timeout: 3600 reboot_timeout: 1800 poll_delay: 20 - # 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/synoupgrade" + - "/usr/bin/synoupgrade" - "/usr/sbin/synoupgrade2" + - "/usr/bin/synoupgrade2" - # Commandes possibles pour lancer l’install (selon DSM) start_subcommands: - "--start" - "--upgrade" @@ -31,20 +26,18 @@ - "--install" tasks: - # 0) Détecter le binaire présent - - name: Détecter synoupgrade (ou synoupgrade2) sur le NAS + - name: Détecter synoupgrade (sans [ ] ; fallback PATH) ansible.builtin.raw: | set -e FOUND="" for p in {{ synoupgrade_candidates | join(' ') }}; do - if [ -x "$p" ]; then + if test -x "$p"; then FOUND="$p" break fi done - # fallback: PATH (busybox) - if [ -z "$FOUND" ]; then + if test -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 @@ -52,13 +45,7 @@ fi fi - if [ -n "$FOUND" ]; then - echo "FOUND=$FOUND" - exit 0 - else - echo "FOUND=" - exit 0 - fi + echo "FOUND=$FOUND" register: detect changed_when: false @@ -70,16 +57,15 @@ - 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" + synoupgrade introuvable. Sortie détection: + {{ detect.stdout | default('') }} when: synoupgrade_bin == "" - name: Afficher le binaire trouvé ansible.builtin.debug: msg: "synoupgrade utilisé: {{ synoupgrade_bin }}" - # 1) Check mise à jour dispo + # 1) Check update - name: Check mise à jour disponible ansible.builtin.raw: "{{ synoupgrade_bin }} --check || true" register: check_out @@ -89,7 +75,8 @@ ansible.builtin.debug: var: check_out.stdout_lines - # Heuristique : stop si rien + # Si check ne renvoie rien, on NE STOP pas automatiquement, car certains DSM sont muets. + # On stop seulement si on voit des motifs "no update". - name: Stop si aucune mise à jour détectée (heuristique) ansible.builtin.meta: end_play when: > @@ -108,8 +95,8 @@ ansible.builtin.debug: var: download_start.stdout_lines - # 3) Attendre fin download (status ou log) - - name: Attendre fin du téléchargement (poll status/log) + # 3) Poll download + - name: Attendre fin du téléchargement (status/log) ansible.builtin.raw: | set -e if {{ synoupgrade_bin }} --status >/dev/null 2>&1; then @@ -133,7 +120,7 @@ ansible.builtin.debug: var: dl_poll.stdout_lines - # 4) Démarrer installation (essais) + # 4) Start install (best effort) - name: Tenter de démarrer l'installation (plusieurs sous-commandes) ansible.builtin.raw: "{{ synoupgrade_bin }} {{ item }} || true" loop: "{{ start_subcommands }}" @@ -141,7 +128,7 @@ changed_when: true failed_when: false - - name: Choisir la première tentative qui ne ressemble pas à une erreur + - name: Choisir la première tentative OK (pas de mots d'erreur) ansible.builtin.set_fact: start_ok: >- {{ @@ -152,7 +139,7 @@ | first) | default({}) }} - - name: Fail si aucune commande de démarrage ne marche + - name: Fail si aucune commande start ne marche ansible.builtin.fail: msg: >- Impossible de démarrer l'installation via synoupgrade. @@ -167,7 +154,7 @@ - "stdout: {{ start_ok.stdout | default('') }}" - "stderr: {{ start_ok.stderr | default('') }}" - # 5) Attente reboot : le NAS peut couper SSH + # 5) Wait reboot (SSH down/up) - name: Attendre que le NAS coupe SSH (reboot probable) ansible.builtin.wait_for: host: "{{ inventory_hostname }}"