|
| 1 | +--- |
| 2 | +- name: "[clean] Stop and undefine new VMs" |
| 3 | + shell: | |
| 4 | + sudo virsh destroy {{ item.name }} 2>/dev/null || true |
| 5 | + sudo virsh undefine {{ item.name }} --remove-all-storage 2>/dev/null || true |
| 6 | + loop: "{{ sno_new_nodes }}" |
| 7 | + failed_when: false |
| 8 | + changed_when: true |
| 9 | + |
| 10 | +- name: "[clean] Remove disk images" |
| 11 | + file: |
| 12 | + path: "{{ sno_vm_image_dir }}/{{ item.name }}.qcow2" |
| 13 | + state: absent |
| 14 | + loop: "{{ sno_new_nodes }}" |
| 15 | + become: true |
| 16 | + failed_when: false |
| 17 | + |
| 18 | +- name: "[clean] Remove NVRAM files" |
| 19 | + file: |
| 20 | + path: "/var/lib/libvirt/qemu/nvram/{{ item.name }}_VARS.fd" |
| 21 | + state: absent |
| 22 | + loop: "{{ sno_new_nodes }}" |
| 23 | + become: true |
| 24 | + failed_when: false |
| 25 | + |
| 26 | +- name: "[clean] Remove per-node RHCOS ISOs" |
| 27 | + file: |
| 28 | + path: "/var/lib/libvirt/images/rhcos-{{ item.hostname }}.iso" |
| 29 | + state: absent |
| 30 | + loop: "{{ sno_new_nodes }}" |
| 31 | + become: true |
| 32 | + failed_when: false |
| 33 | + |
| 34 | +- name: "[clean] Remove DHCP reservations from libvirt network" |
| 35 | + shell: | |
| 36 | + NET_XML=$(sudo virsh net-dumpxml {{ sno_libvirt_network }} 2>/dev/null || true) |
| 37 | + EXISTING_MAC=$(echo "$NET_XML" | python3 -c " |
| 38 | + import xml.etree.ElementTree as ET, sys |
| 39 | + root = ET.parse(sys.stdin).getroot() |
| 40 | + for host in root.findall('.//dhcp/host'): |
| 41 | + if host.get('ip') == '{{ item.ip }}': |
| 42 | + print(host.get('mac','')) |
| 43 | + " 2>/dev/null || true) |
| 44 | +
|
| 45 | + if [ -n "$EXISTING_MAC" ]; then |
| 46 | + sudo virsh net-update {{ sno_libvirt_network }} delete ip-dhcp-host \ |
| 47 | + "<host mac='${EXISTING_MAC}' ip='{{ item.ip }}'/>" --live --config 2>/dev/null || true |
| 48 | + echo "Removed DHCP reservation for {{ item.ip }} (mac=${EXISTING_MAC})" |
| 49 | + else |
| 50 | + echo "No DHCP reservation found for {{ item.ip }}" |
| 51 | + fi |
| 52 | + loop: "{{ sno_new_nodes }}" |
| 53 | + failed_when: false |
| 54 | + changed_when: true |
| 55 | + |
| 56 | +- name: "[clean] Remove DNS host entries from libvirt network" |
| 57 | + shell: | |
| 58 | + sudo virsh net-update {{ sno_libvirt_network }} delete dns-host \ |
| 59 | + "<host ip='{{ item.ip }}'><hostname>{{ item.hostname }}.{{ sno_cluster_domain }}</hostname></host>" \ |
| 60 | + --live --config 2>/dev/null || true |
| 61 | + sudo virsh net-update {{ sno_libvirt_network }} delete dns-host \ |
| 62 | + "<host ip='{{ item.ip }}'><hostname>{{ item.hostname }}</hostname></host>" \ |
| 63 | + --live --config 2>/dev/null || true |
| 64 | + loop: "{{ sno_new_nodes }}" |
| 65 | + failed_when: false |
| 66 | + changed_when: true |
| 67 | + |
| 68 | +- name: "[clean] Remove api-int from libvirt network DNS" |
| 69 | + shell: | |
| 70 | + sudo virsh net-update {{ sno_libvirt_network }} delete dns-host \ |
| 71 | + "<host ip='{{ sno_master0_ip }}'><hostname>api-int.{{ sno_cluster_domain }}</hostname></host>" \ |
| 72 | + --live --config 2>/dev/null || true |
| 73 | + failed_when: false |
| 74 | + changed_when: true |
| 75 | + |
| 76 | +- name: "[clean] Remove entries from addnhosts" |
| 77 | + lineinfile: |
| 78 | + path: "{{ sno_addnhosts_path }}" |
| 79 | + regexp: "^{{ item.ip }}\\s" |
| 80 | + state: absent |
| 81 | + loop: "{{ sno_new_nodes }}" |
| 82 | + become: true |
| 83 | + failed_when: false |
| 84 | + |
| 85 | +- name: "[clean] Remove hostname entries from addnhosts" |
| 86 | + lineinfile: |
| 87 | + path: "{{ sno_addnhosts_path }}" |
| 88 | + regexp: "\\s{{ item.hostname }}\\.{{ sno_cluster_domain }}(\\s|$)" |
| 89 | + state: absent |
| 90 | + loop: "{{ sno_new_nodes }}" |
| 91 | + become: true |
| 92 | + failed_when: false |
| 93 | + |
| 94 | +- name: "[clean] Flush DHCP leases for new node IPs" |
| 95 | + shell: | |
| 96 | + python3 -c " |
| 97 | + import json, os |
| 98 | + lf = '{{ sno_lease_file }}' |
| 99 | + if not os.path.exists(lf) or os.path.getsize(lf) == 0: |
| 100 | + exit(0) |
| 101 | + with open(lf) as f: |
| 102 | + leases = json.load(f) |
| 103 | + reserved = {{ [sno_master1_ip, sno_master2_ip] | to_json }} |
| 104 | + before = len(leases) |
| 105 | + leases = [l for l in leases if l.get('ip-address') not in reserved] |
| 106 | + with open(lf, 'w') as f: |
| 107 | + json.dump(leases, f, indent=2) |
| 108 | + print(f'Flushed {before - len(leases)} leases') |
| 109 | + " |
| 110 | + become: true |
| 111 | + failed_when: false |
| 112 | + changed_when: true |
| 113 | + |
| 114 | +- name: "[clean] Reload libvirt dnsmasq" |
| 115 | + shell: | |
| 116 | + sudo kill -HUP $(cat /run/libvirt/network/{{ sno_libvirt_bridge }}.pid) 2>/dev/null || true |
| 117 | + changed_when: true |
| 118 | + failed_when: false |
| 119 | + |
| 120 | +- name: "[clean] Cleanup complete" |
| 121 | + debug: |
| 122 | + msg: >- |
| 123 | + Removed VMs: {{ sno_new_nodes | map(attribute='name') | list | join(', ') }}. |
| 124 | + Disk images, NVRAM, ISOs, DHCP reservations, and DNS entries removed. |
0 commit comments