From 379fc4933114d70f723919916acc6b9ba4264296 Mon Sep 17 00:00:00 2001 From: Semaphore Date: Tue, 10 Mar 2026 14:22:38 -0700 Subject: [PATCH] =?UTF-8?q?Add=20snapshot=20role=20=E2=80=94=20Proxmox=20a?= =?UTF-8?q?nd=20XCP-NG=20pre-patch=20snapshot=20with=20verification?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- roles/snapshot/defaults/main.yml | 14 ++++++- roles/snapshot/tasks/main.yml | 68 ++++++++++++++++++++++++++++++-- 2 files changed, 77 insertions(+), 5 deletions(-) diff --git a/roles/snapshot/defaults/main.yml b/roles/snapshot/defaults/main.yml index 67ce35b..f225bd9 100644 --- a/roles/snapshot/defaults/main.yml +++ b/roles/snapshot/defaults/main.yml @@ -1,2 +1,14 @@ --- -# snapshot default variables +snapshot_name_prefix: "ansible-pre-patch" +snapshot_retain_count: 3 +hypervisor_type: "proxmox" + +# Proxmox defaults — override in client inventory +proxmox_api_host: "" +proxmox_api_user: "ansible@pam" +proxmox_api_password: "" +proxmox_vmid: "" + +# XCP-NG defaults — override in client inventory +xcpng_host: "" +xcpng_vm_uuid: "" diff --git a/roles/snapshot/tasks/main.yml b/roles/snapshot/tasks/main.yml index dc42904..315511e 100644 --- a/roles/snapshot/tasks/main.yml +++ b/roles/snapshot/tasks/main.yml @@ -1,6 +1,66 @@ --- -# snapshot tasks -# Implementation to follow -- name: Placeholder +# Detect hypervisor type from inventory var: hypervisor_type (proxmox or xcpng) + +- name: Create pre-patch snapshot (Proxmox) + community.general.proxmox_snap: + api_host: "{{ proxmox_api_host }}" + api_user: "{{ proxmox_api_user }}" + api_password: "{{ proxmox_api_password }}" + vmid: "{{ proxmox_vmid }}" + state: present + snapname: "{{ snapshot_name_prefix }}-{{ ansible_date_time.date }}-{{ ansible_date_time.hour }}{{ ansible_date_time.minute }}" + description: "Ansible pre-patch snapshot {{ ansible_date_time.iso8601 }}" + register: proxmox_snapshot_result + when: hypervisor_type == "proxmox" + delegate_to: localhost + +- name: Store Proxmox snapshot name + ansible.builtin.set_fact: + snapshot_id: "{{ snapshot_name_prefix }}-{{ ansible_date_time.date }}-{{ ansible_date_time.hour }}{{ ansible_date_time.minute }}" + when: hypervisor_type == "proxmox" + +- name: Create pre-patch snapshot (XCP-NG) + ansible.builtin.shell: | + xe vm-snapshot vm={{ xcpng_vm_uuid }} new-name-label="{{ snapshot_name_prefix }}-{{ ansible_date_time.date }}-{{ ansible_date_time.hour }}{{ ansible_date_time.minute }}" + register: xcpng_snapshot_result + changed_when: xcpng_snapshot_result.rc == 0 + when: hypervisor_type == "xcpng" + delegate_to: "{{ xcpng_host }}" + +- name: Store XCP-NG snapshot UUID + ansible.builtin.set_fact: + snapshot_id: "{{ xcpng_snapshot_result.stdout | trim }}" + when: hypervisor_type == "xcpng" + +- name: Verify snapshot was created (Proxmox) + community.general.proxmox_snap: + api_host: "{{ proxmox_api_host }}" + api_user: "{{ proxmox_api_user }}" + api_password: "{{ proxmox_api_password }}" + vmid: "{{ proxmox_vmid }}" + snapname: "{{ snapshot_id }}" + state: present + register: proxmox_snap_verify + when: hypervisor_type == "proxmox" + delegate_to: localhost + +- name: Verify snapshot was created (XCP-NG) + ansible.builtin.shell: | + xe snapshot-list uuid={{ snapshot_id }} | grep uuid + register: xcpng_snap_verify + changed_when: false + failed_when: xcpng_snap_verify.stdout == "" + when: hypervisor_type == "xcpng" + delegate_to: "{{ xcpng_host }}" + +- name: Assert snapshot exists before proceeding + ansible.builtin.assert: + that: + - snapshot_id is defined + - snapshot_id != "" + fail_msg: "SNAPSHOT: Failed to create or verify snapshot for {{ inventory_hostname }}. Aborting patch run." + success_msg: "Snapshot verified: {{ snapshot_id }}" + +- name: Log snapshot ID ansible.builtin.debug: - msg: "snapshot role - tasks to be implemented" + msg: "Pre-patch snapshot created: {{ snapshot_id }} for {{ inventory_hostname }}"