From 6c9110bb8b6c92da9084594fec6cab41983bc903 Mon Sep 17 00:00:00 2001 From: Sean Mooney Date: Tue, 17 Feb 2026 18:22:22 +0000 Subject: [PATCH] Handle missing libvirt services in evacuate hook On Debian 13 (Trixie), libvirt packaging is modularized and the libvirt-daemon-lock package (providing virtlockd) is optional. The evacuate hook previously assumed all libvirt services were installed and failed when stopping/starting missing units. Extract a reusable manage_libvirt_service.yaml task file that checks if a service exists via systemctl list-unit-files before managing its units. This prevents failures when optional libvirt packages are not installed and future-proofs against further packaging changes. Generated-By: claude-code Co-Authored-By: Claude Opus 4.6 Change-Id: Ie84e2e8ab2d3065b1562ee5e256fa163541955f7 Signed-off-by: Sean Mooney --- roles/run-evacuate-hook/tasks/main.yaml | 82 +++++++++++-------- .../tasks/manage_libvirt_service.yaml | 22 +++++ 2 files changed, 70 insertions(+), 34 deletions(-) create mode 100644 roles/run-evacuate-hook/tasks/manage_libvirt_service.yaml diff --git a/roles/run-evacuate-hook/tasks/main.yaml b/roles/run-evacuate-hook/tasks/main.yaml index 9d6d7c59f3..ba5c998793 100644 --- a/roles/run-evacuate-hook/tasks/main.yaml +++ b/roles/run-evacuate-hook/tasks/main.yaml @@ -48,23 +48,30 @@ state: destroyed with_items: "{{ subnode_vms.list_vms }}" -- name: Stop libvirtd on "{{ inventory_hostname }}" - become: true - systemd: - name: "{{ item }}" - state: stopped - enabled: no - with_items: - - libvirtd.service - - libvirtd.socket - - libvirtd-admin.socket - - libvirtd-ro.socket - - virtlogd.service - - virtlogd-admin.socket - - virtlogd.socket - - virtlockd.service - - virtlockd-admin.socket - - virtlockd.socket +- name: Stop libvirt services on "{{ inventory_hostname }}" + include_tasks: manage_libvirt_service.yaml + vars: + service_name: "{{ item.name }}" + service_state: stopped + service_enabled: "no" + service_units: "{{ item.units }}" + loop: + - name: libvirtd + units: + - libvirtd.service + - libvirtd.socket + - libvirtd-admin.socket + - libvirtd-ro.socket + - name: virtlogd + units: + - virtlogd.service + - virtlogd-admin.socket + - virtlogd.socket + - name: virtlockd + units: + - virtlockd.service + - virtlockd-admin.socket + - virtlockd.socket - name: Run negative evacuate tests become: true @@ -73,23 +80,30 @@ environment: CONTROLLER_HOSTNAME: "{{ hostvars['controller']['ansible_hostname'] }}" -- name: Start libvirtd on "{{ inventory_hostname }}" - become: true - systemd: - name: "{{ item }}" - state: started - enabled: yes - with_items: - - libvirtd.service - - libvirtd.socket - - libvirtd-admin.socket - - libvirtd-ro.socket - - virtlogd.service - - virtlogd-admin.socket - - virtlogd.socket - - virtlockd.service - - virtlockd-admin.socket - - virtlockd.socket +- name: Start libvirt services on "{{ inventory_hostname }}" + include_tasks: manage_libvirt_service.yaml + vars: + service_name: "{{ item.name }}" + service_state: started + service_enabled: "yes" + service_units: "{{ item.units }}" + loop: + - name: libvirtd + units: + - libvirtd.service + - libvirtd.socket + - libvirtd-admin.socket + - libvirtd-ro.socket + - name: virtlogd + units: + - virtlogd.service + - virtlogd-admin.socket + - virtlogd.socket + - name: virtlockd + units: + - virtlockd.service + - virtlockd-admin.socket + - virtlockd.socket - name: Run evacuate tests become: true diff --git a/roles/run-evacuate-hook/tasks/manage_libvirt_service.yaml b/roles/run-evacuate-hook/tasks/manage_libvirt_service.yaml new file mode 100644 index 0000000000..7d11ff978d --- /dev/null +++ b/roles/run-evacuate-hook/tasks/manage_libvirt_service.yaml @@ -0,0 +1,22 @@ +# Manage a libvirt service (stop/start) only if it is installed. +# Parameters: +# service_name: base name of the service (e.g. "libvirtd", "virtlogd", "virtlockd") +# service_state: "stopped" or "started" +# service_enabled: "yes" or "no" +# service_units: list of unit names to manage + +- name: "Check if {{ service_name }} is installed" + become: true + command: systemctl list-unit-files {{ service_name }}.service + register: _service_check + ignore_errors: true + changed_when: false + +- name: "Manage {{ service_name }} units" + become: true + systemd: + name: "{{ item }}" + state: "{{ service_state }}" + enabled: "{{ service_enabled }}" + with_items: "{{ service_units }}" + when: _service_check is succeeded