incus-contrib/.claude/rules/awx-integration.md

2.0 KiB

paths
ansible/**
incusos/deploy-awx
incusos/awx-manifests/*
notes/awx-guide.md

AWX Integration (Ansible for Aether)

Overview

  • AWX: open-source Ansible platform. Debian 12 VM with K3s + AWX Operator.
  • Lab VM: awx on oc-node-02, IP 192.168.102.161/22 (VLAN 69).
  • AWX URL: http://192.168.102.161:30080 (K3s NodePort, not Traefik ingress).
  • deploy-awx script: --deploy, --status, --heal, --configure, --join-aether, --cleanup, --doctor.

Live job output

Capture AWX job output while running (don't just poll status):

curl -sk http://192.168.102.161:30080/api/v2/jobs/{JOB_ID}/stdout/?format=txt \
  -H "Authorization: Bearer $AWX_TOKEN"

Aether extra vars

Aether passes ffsdn_ prefixed vars: ffsdn_instance_name, ffsdn_instance_ip, ffsdn_cluster_id, ffsdn_cluster_name, ffsdn_deployed_by, ffsdn_image_os, ffsdn_image_release, ffsdn_image_alias.

It does NOT pass: vm_name, vm_ip, environment, owner, cost_center.

Playbook pattern: Incus REST API, not SSH

  • AWX cannot SSH to containers on incusbr0 (not routable, nftables blocks).
  • Use uri module with client cert for file push + exec.
  • Cert at /runner/project/incus-client.crt (EE mounts at /runner/project/, NOT /var/lib/awx/projects/).

Manual project (local_path)

  • EE containers can't reach private git repo.
  • Use scm_type: "", local_path: "incus-contrib".
  • Push playbooks to AWX task pod at /var/lib/awx/projects/incus-contrib/playbooks/.

Gotchas

  • Self-referencing vars: vm_ip: "{{ vm_ip | default('') }}" causes infinite recursion. Use ffsdn_* vars directly.
  • environment is reserved: resolves to [] as extra var.
  • AWX config API bug: PUT /api/clusters/{id}/awx-config returns "Invalid cluster ID" (v6.4.317). Use the Aether UI instead (cluster Settings tab or per-blueprint AWX template IDs).
  • Lifecycle hooks: post-deploy failure -> auto-rollback (instance deleted). Decommission failure does NOT block deletion.