--- # ============================================================================= # Deploy Linux VM Role - Handlers # ============================================================================= # Handlers are triggered by notify directives in tasks # They execute only once at the end of a play, even if notified multiple times # ============================================================================= # ----------------------------------------------------------------------------- # VM Lifecycle Handlers # ----------------------------------------------------------------------------- - name: restart vm community.libvirt.virt: name: "{{ deploy_linux_vm_name }}" state: restarted listen: "restart vm" tags: [never, vm-restart] - name: shutdown vm community.libvirt.virt: name: "{{ deploy_linux_vm_name }}" state: shutdown listen: "shutdown vm" tags: [never, vm-shutdown] - name: destroy vm community.libvirt.virt: name: "{{ deploy_linux_vm_name }}" state: destroyed listen: "destroy vm" tags: [never, vm-destroy] # ----------------------------------------------------------------------------- # Cloud-Init Handlers # ----------------------------------------------------------------------------- - name: regenerate cloud-init iso block: - name: Remove old cloud-init ISO ansible.builtin.file: path: "{{ deploy_linux_vm_cloud_init_iso_path }}" state: absent - name: Recreate cloud-init ISO with updated configuration ansible.builtin.command: cmd: > genisoimage -output {{ deploy_linux_vm_cloud_init_iso_path }} -volid cidata -joliet -rock /tmp/cloud-init-{{ deploy_linux_vm_name }}/user-data /tmp/cloud-init-{{ deploy_linux_vm_name }}/meta-data register: regenerate_iso_result changed_when: regenerate_iso_result.rc == 0 - name: Attach updated cloud-init ISO to VM ansible.builtin.command: cmd: > virsh change-media {{ deploy_linux_vm_name }} hda {{ deploy_linux_vm_cloud_init_iso_path }} --update when: regenerate_iso_result is succeeded changed_when: true listen: "regenerate cloud-init" tags: [cloud-init] # ----------------------------------------------------------------------------- # Storage Handlers # ----------------------------------------------------------------------------- - name: refresh libvirt storage pool community.libvirt.virt_pool: name: default state: refreshed listen: "refresh storage pool" tags: [storage] - name: resize vm disk block: - name: Shutdown VM for disk resize community.libvirt.virt: name: "{{ deploy_linux_vm_name }}" state: shutdown - name: Wait for VM to shutdown ansible.builtin.wait_for: timeout: 30 - name: Resize disk image ansible.builtin.command: cmd: > qemu-img resize {{ deploy_linux_vm_disk_path }} {{ deploy_linux_vm_disk_size_gb }}G register: resize_result changed_when: resize_result.rc == 0 - name: Start VM after resize community.libvirt.virt: name: "{{ deploy_linux_vm_name }}" state: running listen: "resize disk" tags: [never, storage-resize] # ----------------------------------------------------------------------------- # Network Handlers # ----------------------------------------------------------------------------- - name: refresh network configuration ansible.builtin.command: cmd: virsh net-update {{ deploy_linux_vm_network }} add ip-dhcp-host "{{ network_xml }}" --live --config listen: "refresh network" tags: [network] vars: network_xml: "" - name: restart libvirt network ansible.builtin.command: cmd: virsh net-destroy {{ deploy_linux_vm_network }} && virsh net-start {{ deploy_linux_vm_network }} listen: "restart network" tags: [never, network-restart] changed_when: true # ----------------------------------------------------------------------------- # Libvirt Daemon Handlers # ----------------------------------------------------------------------------- - name: restart libvirtd ansible.builtin.service: name: libvirtd state: restarted listen: "restart libvirtd" tags: [never, libvirt-restart] - name: reload libvirtd ansible.builtin.service: name: libvirtd state: reloaded listen: "reload libvirtd" tags: [libvirt] # ----------------------------------------------------------------------------- # Cleanup Handlers # ----------------------------------------------------------------------------- - name: cleanup temporary files ansible.builtin.file: path: "/tmp/cloud-init-{{ deploy_linux_vm_name }}" state: absent listen: "cleanup temp files" tags: [cleanup] - name: remove cloud-init iso ansible.builtin.file: path: "{{ deploy_linux_vm_cloud_init_iso_path }}" state: absent when: deploy_linux_vm_remove_cloud_init_iso_after_boot | bool listen: "remove cloud-init iso" tags: [cleanup] # ----------------------------------------------------------------------------- # Validation Handlers # ----------------------------------------------------------------------------- - name: validate vm status community.libvirt.virt: name: "{{ deploy_linux_vm_name }}" command: status register: vm_status_check listen: "validate vm" tags: [validate] - name: check vm connectivity ansible.builtin.wait_for: host: "{{ deploy_linux_vm_hostname }}" port: 22 timeout: "{{ deploy_linux_vm_ssh_wait_timeout }}" state: started listen: "check connectivity" tags: [validate]