57 lines
2.0 KiB
Markdown
57 lines
2.0 KiB
Markdown
---
|
|
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):
|
|
```bash
|
|
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". Workaround: direct PostgreSQL UPDATE.
|
|
- **Lifecycle hooks**: post-deploy failure -> auto-rollback (instance deleted).
|
|
Decommission failure does NOT block deletion.
|