Actualiser synology_upgrade_ssh.yml

This commit is contained in:
l.covela 2026-01-07 12:09:36 +01:00
parent 1d9060d137
commit 834607c9ad
1 changed files with 19 additions and 32 deletions

View File

@ -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 hosts: synology
gather_facts: false gather_facts: false
vars: vars:
# Temps max (en secondes) pour attendre download / reboot
download_timeout: 3600 download_timeout: 3600
reboot_timeout: 1800 reboot_timeout: 1800
poll_delay: 20 poll_delay: 20
# Chemins probables (DSM varie selon versions/modèles)
synoupgrade_candidates: synoupgrade_candidates:
- "/usr/syno/sbin/synoupgrade" - "/usr/syno/sbin/synoupgrade"
- "/usr/syno/bin/synoupgrade" - "/usr/syno/bin/synoupgrade"
- "/sbin/synoupgrade"
- "/bin/synoupgrade"
- "/usr/bin/synoupgrade"
- "/usr/sbin/synoupgrade"
- "/usr/syno/sbin/synoupgrade2" - "/usr/syno/sbin/synoupgrade2"
- "/usr/syno/bin/synoupgrade2" - "/usr/syno/bin/synoupgrade2"
- "/usr/bin/synoupgrade2" - "/usr/sbin/synoupgrade"
- "/usr/bin/synoupgrade"
- "/usr/sbin/synoupgrade2" - "/usr/sbin/synoupgrade2"
- "/usr/bin/synoupgrade2"
# Commandes possibles pour lancer linstall (selon DSM)
start_subcommands: start_subcommands:
- "--start" - "--start"
- "--upgrade" - "--upgrade"
@ -31,20 +26,18 @@
- "--install" - "--install"
tasks: tasks:
# 0) Détecter le binaire présent - name: Détecter synoupgrade (sans [ ] ; fallback PATH)
- name: Détecter synoupgrade (ou synoupgrade2) sur le NAS
ansible.builtin.raw: | ansible.builtin.raw: |
set -e set -e
FOUND="" FOUND=""
for p in {{ synoupgrade_candidates | join(' ') }}; do for p in {{ synoupgrade_candidates | join(' ') }}; do
if [ -x "$p" ]; then if test -x "$p"; then
FOUND="$p" FOUND="$p"
break break
fi fi
done done
# fallback: PATH (busybox) if test -z "$FOUND"; then
if [ -z "$FOUND" ]; then
if command -v synoupgrade >/dev/null 2>&1; then if command -v synoupgrade >/dev/null 2>&1; then
FOUND="$(command -v synoupgrade)" FOUND="$(command -v synoupgrade)"
elif command -v synoupgrade2 >/dev/null 2>&1; then elif command -v synoupgrade2 >/dev/null 2>&1; then
@ -52,13 +45,7 @@
fi fi
fi fi
if [ -n "$FOUND" ]; then
echo "FOUND=$FOUND" echo "FOUND=$FOUND"
exit 0
else
echo "FOUND="
exit 0
fi
register: detect register: detect
changed_when: false changed_when: false
@ -70,16 +57,15 @@
- name: Fail si synoupgrade introuvable - name: Fail si synoupgrade introuvable
ansible.builtin.fail: ansible.builtin.fail:
msg: >- msg: >-
synoupgrade introuvable sur ce NAS (DSM/ modèle). synoupgrade introuvable. Sortie détection:
stdout: {{ detect.stdout | default('') }} {{ detect.stdout | default('') }}
=> Donne-moi la sortie de : "ls -l /usr/syno/sbin /usr/syno/bin | grep -i upgrad"
when: synoupgrade_bin == "" when: synoupgrade_bin == ""
- name: Afficher le binaire trouvé - name: Afficher le binaire trouvé
ansible.builtin.debug: ansible.builtin.debug:
msg: "synoupgrade utilisé: {{ synoupgrade_bin }}" msg: "synoupgrade utilisé: {{ synoupgrade_bin }}"
# 1) Check mise à jour dispo # 1) Check update
- name: Check mise à jour disponible - name: Check mise à jour disponible
ansible.builtin.raw: "{{ synoupgrade_bin }} --check || true" ansible.builtin.raw: "{{ synoupgrade_bin }} --check || true"
register: check_out register: check_out
@ -89,7 +75,8 @@
ansible.builtin.debug: ansible.builtin.debug:
var: check_out.stdout_lines 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) - name: Stop si aucune mise à jour détectée (heuristique)
ansible.builtin.meta: end_play ansible.builtin.meta: end_play
when: > when: >
@ -108,8 +95,8 @@
ansible.builtin.debug: ansible.builtin.debug:
var: download_start.stdout_lines var: download_start.stdout_lines
# 3) Attendre fin download (status ou log) # 3) Poll download
- name: Attendre fin du téléchargement (poll status/log) - name: Attendre fin du téléchargement (status/log)
ansible.builtin.raw: | ansible.builtin.raw: |
set -e set -e
if {{ synoupgrade_bin }} --status >/dev/null 2>&1; then if {{ synoupgrade_bin }} --status >/dev/null 2>&1; then
@ -133,7 +120,7 @@
ansible.builtin.debug: ansible.builtin.debug:
var: dl_poll.stdout_lines 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) - name: Tenter de démarrer l'installation (plusieurs sous-commandes)
ansible.builtin.raw: "{{ synoupgrade_bin }} {{ item }} || true" ansible.builtin.raw: "{{ synoupgrade_bin }} {{ item }} || true"
loop: "{{ start_subcommands }}" loop: "{{ start_subcommands }}"
@ -141,7 +128,7 @@
changed_when: true changed_when: true
failed_when: false 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: ansible.builtin.set_fact:
start_ok: >- start_ok: >-
{{ {{
@ -152,7 +139,7 @@
| first) | default({}) | first) | default({})
}} }}
- name: Fail si aucune commande de démarrage ne marche - name: Fail si aucune commande start ne marche
ansible.builtin.fail: ansible.builtin.fail:
msg: >- msg: >-
Impossible de démarrer l'installation via synoupgrade. Impossible de démarrer l'installation via synoupgrade.
@ -167,7 +154,7 @@
- "stdout: {{ start_ok.stdout | default('') }}" - "stdout: {{ start_ok.stdout | default('') }}"
- "stderr: {{ start_ok.stderr | 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) - name: Attendre que le NAS coupe SSH (reboot probable)
ansible.builtin.wait_for: ansible.builtin.wait_for:
host: "{{ inventory_hostname }}" host: "{{ inventory_hostname }}"