prole/infrastructure/roles/k3s/tasks/acme_cert.yml
chrisfu b114099e17 Use prole.cfg hostnames for Supabase front-door
- Persist and export supabase_hostname for canonical external Supabase entrypoint (db.prole.org)

- Render Supabase Helm ingress host and public URLs (API_EXTERNAL_URL/GOTRUE_SITE_URL/SUPABASE_PUBLIC_URL) from config

- Align tracked Traefik ingress manifests to db.prole.org

- Generalize service hostname/TLS wiring in k3s automation and refresh Kong/monitoring behavior

- Make optional workload policy checks deterministic when kube context is absent; add render tests
2026-03-19 04:19:38 -07:00

120 lines
3.6 KiB
YAML

---
- name: Ensure cert-manager CRDs exist for ACME
ansible.builtin.command: k3s kubectl get crd certificates.cert-manager.io
register: k3s_acme_crd
changed_when: false
failed_when: k3s_acme_crd.rc != 0
run_once: true
- name: Check for flannel DaemonSet (k3s default CNI)
ansible.builtin.command: k3s kubectl -n kube-system get daemonset kube-flannel-ds
register: _k3s_flannel_ds
changed_when: false
failed_when: false
run_once: true
- name: Wait for flannel DaemonSet rollout (ensures pod network is routable)
ansible.builtin.command: k3s kubectl -n kube-system rollout status daemonset/kube-flannel-ds --timeout=300s
register: _k3s_flannel_rollout
changed_when: false
retries: 6
delay: 10
until: _k3s_flannel_rollout.rc == 0
when: _k3s_flannel_ds.rc == 0
run_once: true
- name: Check for kube-proxy DaemonSet
ansible.builtin.command: k3s kubectl -n kube-system get daemonset kube-proxy
register: _k3s_kube_proxy_ds
changed_when: false
failed_when: false
run_once: true
- name: Wait for kube-proxy DaemonSet rollout
ansible.builtin.command: k3s kubectl -n kube-system rollout status daemonset/kube-proxy --timeout=300s
register: _k3s_kube_proxy_rollout
changed_when: false
retries: 6
delay: 10
until: _k3s_kube_proxy_rollout.rc == 0
when: _k3s_kube_proxy_ds.rc == 0
run_once: true
- name: Wait for cert-manager-webhook deployment (required for validating ClusterIssuer/Certificate)
ansible.builtin.command: k3s kubectl -n cert-manager rollout status deployment/cert-manager-webhook --timeout=900s
register: k3s_certmgr_webhook_rollout
changed_when: false
retries: 3
delay: 20
until: k3s_certmgr_webhook_rollout.rc == 0
run_once: true
- name: Wait for cert-manager-webhook service endpoints
ansible.builtin.command: >-
k3s kubectl -n cert-manager get endpoints cert-manager-webhook
-o jsonpath='{.subsets[*].addresses[*].ip}'
register: k3s_certmgr_webhook_endpoints
changed_when: false
retries: 90
delay: 10
until:
- k3s_certmgr_webhook_endpoints.rc == 0
- (k3s_certmgr_webhook_endpoints.stdout | trim) | length > 0
run_once: true
- name: Set ACME contact email (defaults to admin@prole.org)
ansible.builtin.set_fact:
svc_check_acme_email: "{{ letsencrypt_email | default('admin@prole.org') }}"
run_once: true
- name: Ensure namespace exists for ACME certificate secret
ansible.builtin.shell: |
k3s kubectl apply -f - <<'EOF'
apiVersion: v1
kind: Namespace
metadata:
name: {{ k3s_svc_check_kong_namespace }}
EOF
args:
executable: /bin/bash
run_once: true
- name: Configure ACME ClusterIssuer and Certificate for service hostname
ansible.builtin.shell: |
k3s kubectl apply -f - <<'EOF'
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: {{ k3s_service_cluster_issuer }}
spec:
acme:
email: {{ svc_check_acme_email }}
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: {{ k3s_service_cluster_issuer }}
solvers:
- http01:
ingress:
class: traefik
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: {{ k3s_service_cert_name }}
namespace: {{ k3s_svc_check_kong_namespace }}
spec:
secretName: {{ k3s_service_tls_secret_name }}
issuerRef:
name: {{ k3s_service_cluster_issuer }}
kind: ClusterIssuer
dnsNames:
- {{ k3s_service_hostname }}
EOF
args:
executable: /bin/bash
register: k3s_acme_apply
retries: 90
delay: 10
until: k3s_acme_apply.rc == 0
run_once: true