incus-contrib/ansible/playbooks/decommission.yml

78 lines
2.7 KiB
YAML

---
# decommission.yml — Runs before Aether deletes an instance
#
# Aether passes the same ffsdn_ extra vars as post-deploy:
# ffsdn_instance_name, ffsdn_instance_ip, ffsdn_cluster_id,
# ffsdn_cluster_name, ffsdn_deployed_by
#
# This playbook runs best-effort: failures do NOT block instance
# deletion in Aether. Uses the Incus REST API for all operations
# (no SSH needed).
- name: Decommission — graceful shutdown and logging
hosts: localhost
gather_facts: false
connection: local
vars:
incus_api: "https://192.168.102.140:8443"
# AWX runner mounts project at /runner/project/ during job execution
incus_cert: "/runner/project/incus-client.crt"
incus_key: "/runner/project/incus-client.key"
tasks:
- name: Check if instance still exists
ansible.builtin.uri:
url: "{{ incus_api }}/1.0/instances/{{ ffsdn_instance_name }}"
method: GET
client_cert: "{{ incus_cert }}"
client_key: "{{ incus_key }}"
validate_certs: false
return_content: true
status_code: [200, 404]
register: instance_check
when: ffsdn_instance_name is defined
- name: Stop application services (best-effort)
ansible.builtin.uri:
url: "{{ incus_api }}/1.0/instances/{{ ffsdn_instance_name }}/exec"
method: POST
client_cert: "{{ incus_cert }}"
client_key: "{{ incus_key }}"
validate_certs: false
body_format: json
body:
command:
- "/bin/bash"
- "-c"
- |
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 2>/dev/null || true
journalctl --flush 2>/dev/null || true
record-output: false
interactive: false
wait-for-websocket: false
status_code: [202]
ignore_errors: true
when:
- instance_check is defined
- instance_check.status == 200
- instance_check.json.metadata.status is defined
- instance_check.json.metadata.status == "Running"
- name: Record decommission in ledger
ansible.builtin.lineinfile:
path: /tmp/awx-deploy-ledger.log
line: >-
{{ lookup('pipe', 'date -Iseconds') }}
DECOMMISSION instance={{ ffsdn_instance_name | default('unknown') }}
ip={{ ffsdn_instance_ip | default('') }}
cluster={{ ffsdn_cluster_name | default('unknown') }}
deployed_by={{ ffsdn_deployed_by | default('unknown') }}
status=completed
create: true
mode: "0644"