Actualiser synology_dsm_upgrade_api.yml
This commit is contained in:
parent
465447c9e0
commit
adb144b112
|
|
@ -14,13 +14,20 @@
|
||||||
|
|
||||||
refuse_if_no_upgrade_api: true
|
refuse_if_no_upgrade_api: true
|
||||||
|
|
||||||
# méthodes candidates (DSM varie)
|
# Méthodes candidates (DSM varie selon versions)
|
||||||
upgrade_status_methods:
|
upgrade_status_methods:
|
||||||
- "status"
|
- "status"
|
||||||
- "get"
|
- "get"
|
||||||
- "check"
|
- "check"
|
||||||
|
|
||||||
|
# Méthode "start" pour déclencher l'upgrade
|
||||||
upgrade_start_method: "start"
|
upgrade_start_method: "start"
|
||||||
|
|
||||||
|
# Attente reboot (sec)
|
||||||
|
reboot_wait_timeout: 1800 # 30 min
|
||||||
|
reboot_down_timeout: 300 # 5 min
|
||||||
|
reboot_up_timeout: 1800 # 30 min
|
||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
- name: Construire base_url
|
- name: Construire base_url
|
||||||
ansible.builtin.set_fact:
|
ansible.builtin.set_fact:
|
||||||
|
|
@ -118,15 +125,6 @@
|
||||||
| first) | default({})
|
| first) | default({})
|
||||||
}}
|
}}
|
||||||
|
|
||||||
- name: Afficher les réponses status (debug)
|
|
||||||
ansible.builtin.debug:
|
|
||||||
var: upgrade_status_attempts.results
|
|
||||||
|
|
||||||
- name: Afficher statut retenu (debug)
|
|
||||||
ansible.builtin.debug:
|
|
||||||
var: upgrade_status.json
|
|
||||||
when: upgrade_status | length > 0
|
|
||||||
|
|
||||||
- name: Fail si aucune méthode status n'a fonctionné
|
- name: Fail si aucune méthode status n'a fonctionné
|
||||||
ansible.builtin.fail:
|
ansible.builtin.fail:
|
||||||
msg: >-
|
msg: >-
|
||||||
|
|
@ -134,17 +132,25 @@
|
||||||
Vérifie les méthodes supportées (status/get/check) sur ce DSM.
|
Vérifie les méthodes supportées (status/get/check) sur ce DSM.
|
||||||
when: upgrade_status | length == 0
|
when: upgrade_status | length == 0
|
||||||
|
|
||||||
# ---- START : seulement si "ready" (on ne devine pas : on log l’état) ----
|
- name: Debug - statut retenu
|
||||||
- name: Déterminer si une mise à jour semble prête (heuristique)
|
ansible.builtin.debug:
|
||||||
|
var: upgrade_status.json
|
||||||
|
|
||||||
|
# ---- READY CHECK (inclut ton cas "ready_upgrade") ----
|
||||||
|
- name: Déterminer si une mise à jour est prête
|
||||||
ansible.builtin.set_fact:
|
ansible.builtin.set_fact:
|
||||||
upgrade_ready: >-
|
upgrade_ready: >-
|
||||||
{{
|
{{
|
||||||
(
|
(
|
||||||
(upgrade_status.json.data is defined)
|
(upgrade_status.json.data is defined)
|
||||||
and (
|
and (
|
||||||
(upgrade_status.json.data.ready is defined and upgrade_status.json.data.ready | bool)
|
(upgrade_status.json.data.allow_upgrade is defined and upgrade_status.json.data.allow_upgrade | bool)
|
||||||
or (upgrade_status.json.data.need_update is defined and upgrade_status.json.data.need_update | bool == false)
|
and (
|
||||||
or (upgrade_status.json.data.status is defined and (upgrade_status.json.data.status|string) in ['ready','downloaded','prepared'])
|
(upgrade_status.json.data.status is defined and (upgrade_status.json.data.status|string) in
|
||||||
|
['ready','downloaded','prepared','ready_upgrade']
|
||||||
|
)
|
||||||
|
or (upgrade_status.json.data.ready is defined and upgrade_status.json.data.ready | bool)
|
||||||
|
)
|
||||||
)
|
)
|
||||||
) | default(false)
|
) | default(false)
|
||||||
}}
|
}}
|
||||||
|
|
@ -152,7 +158,7 @@
|
||||||
- name: Stop si pas prête (évite code 103) + message clair
|
- name: Stop si pas prête (évite code 103) + message clair
|
||||||
ansible.builtin.fail:
|
ansible.builtin.fail:
|
||||||
msg: >-
|
msg: >-
|
||||||
DSM refuse le start (souvent code 103) car la mise à jour n’est pas "prête".
|
DSM n'est pas prêt à lancer l'upgrade via API (souvent code 103 si on force).
|
||||||
Vérifie sur DSM: Panneau de config > Mise à jour DSM :
|
Vérifie sur DSM: Panneau de config > Mise à jour DSM :
|
||||||
- téléchargement terminé
|
- téléchargement terminé
|
||||||
- EULA/consentement accepté
|
- EULA/consentement accepté
|
||||||
|
|
@ -160,27 +166,54 @@
|
||||||
Statut API (data): {{ upgrade_status.json.data | default({}) | to_nice_json }}
|
Statut API (data): {{ upgrade_status.json.data | default({}) | to_nice_json }}
|
||||||
when: not upgrade_ready
|
when: not upgrade_ready
|
||||||
|
|
||||||
- name: Start DSM upgrade (SYNO.Core.Upgrade)
|
# ---- START (POST form-urlencoded, plus fiable) ----
|
||||||
|
- name: Start DSM upgrade (SYNO.Core.Upgrade start)
|
||||||
ansible.builtin.uri:
|
ansible.builtin.uri:
|
||||||
url: "{{ base_url }}/webapi/{{ upgrade_path }}?api=SYNO.Core.Upgrade&version={{ upgrade_ver }}&method={{ upgrade_start_method }}&_sid={{ sid }}"
|
url: "{{ base_url }}/webapi/{{ upgrade_path }}"
|
||||||
method: GET
|
method: POST
|
||||||
validate_certs: "{{ syno_verify_ssl }}"
|
validate_certs: "{{ syno_verify_ssl }}"
|
||||||
return_content: true
|
return_content: true
|
||||||
status_code: 200
|
status_code: 200
|
||||||
timeout: "{{ uri_timeout }}"
|
timeout: "{{ uri_timeout }}"
|
||||||
|
body_format: form-urlencoded
|
||||||
|
body:
|
||||||
|
api: SYNO.Core.Upgrade
|
||||||
|
version: "{{ upgrade_ver }}"
|
||||||
|
method: "{{ upgrade_start_method }}"
|
||||||
|
_sid: "{{ sid }}"
|
||||||
register: upgrade_start
|
register: upgrade_start
|
||||||
|
|
||||||
- name: Fail si start a échoué
|
- name: Fail si start a échoué (message lisible)
|
||||||
ansible.builtin.fail:
|
ansible.builtin.fail:
|
||||||
msg: >-
|
msg: >-
|
||||||
Echec du démarrage upgrade DSM via API.
|
Echec du démarrage upgrade DSM via API.
|
||||||
Réponse: {{ upgrade_start.json | to_nice_json }}
|
Réponse: {{ upgrade_start.json | default(upgrade_start.content) }}
|
||||||
when: upgrade_start.json.success != true
|
when: upgrade_start.json is not defined or upgrade_start.json.success is not defined or upgrade_start.json.success != true
|
||||||
|
|
||||||
- name: Afficher résultat start
|
- name: Afficher résultat start
|
||||||
ansible.builtin.debug:
|
ansible.builtin.debug:
|
||||||
var: upgrade_start.json
|
var: upgrade_start.json
|
||||||
|
|
||||||
|
# ---- WAIT REBOOT (si DSM indique reboot:true, on attend la chute + le retour) ----
|
||||||
|
- name: Attendre que DSM tombe (reboot en cours)
|
||||||
|
ansible.builtin.wait_for:
|
||||||
|
host: "{{ inventory_hostname }}"
|
||||||
|
port: "{{ syno_port }}"
|
||||||
|
state: stopped
|
||||||
|
timeout: "{{ reboot_down_timeout }}"
|
||||||
|
delegate_to: localhost
|
||||||
|
when: upgrade_status.json.data.reboot is defined and upgrade_status.json.data.reboot | bool
|
||||||
|
|
||||||
|
- name: Attendre le retour de DSM (port 5001)
|
||||||
|
ansible.builtin.wait_for:
|
||||||
|
host: "{{ inventory_hostname }}"
|
||||||
|
port: "{{ syno_port }}"
|
||||||
|
state: started
|
||||||
|
delay: 10
|
||||||
|
timeout: "{{ reboot_up_timeout }}"
|
||||||
|
delegate_to: localhost
|
||||||
|
when: upgrade_status.json.data.reboot is defined and upgrade_status.json.data.reboot | bool
|
||||||
|
|
||||||
- name: Logout DSM API
|
- name: Logout DSM API
|
||||||
ansible.builtin.uri:
|
ansible.builtin.uri:
|
||||||
url: "{{ base_url }}/webapi/{{ auth_path }}?api=SYNO.API.Auth&version=2&method=logout&session={{ syno_session | urlencode }}&_sid={{ sid }}"
|
url: "{{ base_url }}/webapi/{{ auth_path }}?api=SYNO.API.Auth&version=2&method=logout&session={{ syno_session | urlencode }}&_sid={{ sid }}"
|
||||||
|
|
@ -190,4 +223,4 @@
|
||||||
status_code: 200
|
status_code: 200
|
||||||
timeout: "{{ uri_timeout }}"
|
timeout: "{{ uri_timeout }}"
|
||||||
register: logout
|
register: logout
|
||||||
failed_when: false
|
failed_when: false
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue