incus-contrib/ansible/playbooks/decommission.yml

79 lines
2.4 KiB
YAML

---
# decommission.yml — Runs before Aether deletes an instance
#
# Aether passes the same extra vars as post-deploy:
# vm_name, vm_ip, environment, owner, cost_center
#
# This playbook runs best-effort: failures do NOT block instance
# deletion in Aether. The playbook should be defensive and handle
# unreachable hosts gracefully.
- name: Decommission — prepare instance for deletion
hosts: localhost
gather_facts: false
connection: local
vars:
vm_name: "{{ vm_name | default('unknown') }}"
vm_ip: "{{ vm_ip | default('') }}"
environment_name: "{{ environment | default('lab') }}"
owner: "{{ owner | default('unassigned') }}"
cost_center: "{{ cost_center | default('') }}"
ssh_user: root
tasks:
- name: Add target host to in-memory inventory
ansible.builtin.add_host:
name: "{{ vm_ip }}"
groups: target
ansible_user: "{{ ssh_user }}"
ansible_host: "{{ vm_ip }}"
when: vm_ip | length > 0
- name: Attempt graceful shutdown on target
hosts: target
gather_facts: false
ignore_unreachable: true
tasks:
- name: Check if host is reachable
ansible.builtin.wait_for_connection:
delay: 0
timeout: 15
register: host_check
ignore_errors: true
- name: Stop application services (best-effort)
ansible.builtin.shell: |
# Stop user-facing services before deletion
systemctl list-units --type=service --state=running --no-legend \
| awk '{print $1}' \
| grep -vE '^(ssh|systemd|dbus|cron|networking|rsyslog)' \
| head -20 \
| xargs -r -n1 systemctl stop
register: service_stop
ignore_errors: true
when: host_check is succeeded
- name: Flush logs to persistent storage
ansible.builtin.command: journalctl --flush
ignore_errors: true
when: host_check is succeeded
- name: Log decommission
hosts: localhost
gather_facts: false
connection: local
tasks:
- name: Record decommission in ledger
ansible.builtin.lineinfile:
path: /var/log/awx-deploy-ledger.log
line: >-
{{ ansible_date_time.iso8601 | default(lookup('pipe', 'date -Iseconds')) }}
DECOMMISSION vm_name={{ vm_name }} vm_ip={{ vm_ip }}
environment={{ environment_name }} owner={{ owner }}
cost_center={{ cost_center }} status=completed
create: true
mode: "0644"