---
# Deploy a tiny static check site and route it through Kong as svc.prole.org
- name: Ensure cert-manager CRDs exist for ACME
ansible.builtin.command: k3s kubectl get crd certificates.cert-manager.io
register: svc_check_certmgr
changed_when: false
failed_when: svc_check_certmgr.rc != 0
run_once: true
- name: Read prole type gif (controller)
ansible.builtin.slurp:
src: "{{ playbook_dir }}/../../img/prole-type.gif"
register: svc_check_gif
delegate_to: localhost
become: false
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: Deploy svc-check site, Kong config, and ingress
ansible.builtin.shell: |
k3s kubectl apply -f - <<'EOF'
apiVersion: v1
kind: Namespace
metadata:
name: svc-check
---
apiVersion: v1
kind: ConfigMap
metadata:
name: svc-check-content
namespace: svc-check
data:
index.html: |
svc.prole.org
svc.prole.org
served by k3s → Kong on myrddin.prole.org
binaryData:
prole-type.gif: {{ svc_check_gif.content | trim | quote }}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: svc-check-web
namespace: svc-check
labels:
app: svc-check-web
spec:
replicas: 1
selector:
matchLabels:
app: svc-check-web
template:
metadata:
labels:
app: svc-check-web
spec:
containers:
- name: nginx
image: nginx:1.27-alpine
ports:
- name: http
containerPort: 80
volumeMounts:
- name: content
mountPath: /usr/share/nginx/html
volumes:
- name: content
configMap:
name: svc-check-content
items:
- key: index.html
path: index.html
- key: prole-type.gif
path: prole-type.gif
---
apiVersion: v1
kind: Service
metadata:
name: svc-check-web
namespace: svc-check
labels:
app: svc-check-web
spec:
selector:
app: svc-check-web
ports:
- name: http
port: 80
targetPort: http
---
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: {{ svc_check_acme_email }}
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: traefik
---
apiVersion: v1
kind: ConfigMap
metadata:
name: prole-db-kong-config
namespace: prole-db
data:
kong.yml: |
_format_version: "3.0"
_transform: true
services:
- name: db-manager
url: http://prole-db-manager.prole-db.svc.cluster.local:80
routes:
- name: backup-route
paths:
- /backup
strip_path: false
- name: kubeconfig
url: http://prole-svc.prole-db.svc.cluster.local:8080
routes:
- name: kubeconfig
paths:
- /k3s/kube_config.sh
- name: svc-check
url: http://svc-check-web.svc-check.svc.cluster.local:80
routes:
- name: svc-check-root
hosts:
- svc.prole.org
paths:
- /
strip_path: false
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: svc-prole-ingress
namespace: prole-db
annotations:
kubernetes.io/ingress.class: traefik
cert-manager.io/cluster-issuer: letsencrypt-prod
traefik.ingress.kubernetes.io/router.priority: "10"
spec:
ingressClassName: traefik
tls:
- hosts:
- svc.prole.org
secretName: svc-prole-org-tls
rules:
- host: svc.prole.org
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: prole-db-kong
port:
number: 8000
EOF
args:
executable: /bin/bash
run_once: true
- name: Restart Kong to reload declarative config
ansible.builtin.shell: k3s kubectl rollout restart deployment/prole-db-kong -n prole-db
changed_when: true
run_once: true