Files
italiadatacenter/pipeline/add-cert-manager-hostalias.sh
2026-09-12 19:21:41 +02:00

76 lines
2.4 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
# Aggiunge un hostname a spec.template.spec.hostAliases del Deployment cert-manager.
#
# Uso:
# ./add-cert-manager-hostalias.sh <hostname>
#
# Esempio:
# ./add-cert-manager-hostalias.sh main-gateway-nginx.nginx-gateway.svc.cluster.local
# ./add-cert-manager-hostalias.sh api.internal
DEPLOYMENT_NAME="cert-manager"
DEPLOYMENT_NS="cert-manager"
TARGET_IP="10.43.37.118"
HOSTNAME_VAL="${1:-}"
if [[ -z "$HOSTNAME_VAL" ]]; then
echo "Uso: $0 <hostname>" >&2
exit 1
fi
if ! command -v kubectl >/dev/null 2>&1; then
echo "Errore: kubectl non trovato nel PATH" >&2
exit 1
fi
if ! command -v jq >/dev/null 2>&1; then
echo "Errore: jq non trovato nel PATH" >&2
echo "Installa jq e riprova." >&2
exit 1
fi
# Idempotenza: controlla solo il blocco hostAliases associato a TARGET_IP.
EXISTING_HOSTNAMES="$(kubectl get deployment "$DEPLOYMENT_NAME" -n "$DEPLOYMENT_NS" -o jsonpath="{.spec.template.spec.hostAliases[?(@.ip=='${TARGET_IP}')].hostnames[*]}" 2>/dev/null || true)"
if echo " $EXISTING_HOSTNAMES " | grep -Fq " $HOSTNAME_VAL "; then
echo "Hostname '$HOSTNAME_VAL' gia presente per IP ${TARGET_IP} in ${DEPLOYMENT_NS}/${DEPLOYMENT_NAME}. Nessuna modifica."
exit 0
fi
DEPLOY_JSON="$(kubectl get deployment "$DEPLOYMENT_NAME" -n "$DEPLOYMENT_NS" -o json)"
UPDATED_HOST_ALIASES="$({
echo "$DEPLOY_JSON" | jq -c --arg ip "$TARGET_IP" --arg hostname "$HOSTNAME_VAL" '
(.spec.template.spec.hostAliases //= [])
| if any(.spec.template.spec.hostAliases[]?; .ip == $ip) then
.spec.template.spec.hostAliases |= map(
if .ip == $ip then
if ((.hostnames // []) | index($hostname)) then
.
else
.hostnames = ((.hostnames // []) + [$hostname])
end
else
.
end
)
else
.spec.template.spec.hostAliases += [{"ip": $ip, "hostnames": [$hostname]}]
end
| .spec.template.spec.hostAliases
'
} )"
PATCH_PAYLOAD="$(jq -cn --argjson hostAliases "$UPDATED_HOST_ALIASES" '{spec:{template:{spec:{hostAliases:$hostAliases}}}}')"
kubectl patch deployment "$DEPLOYMENT_NAME" \
-n "$DEPLOYMENT_NS" \
--type=merge \
-p "$PATCH_PAYLOAD" >/dev/null
echo "Hostname aggiunto con successo."
echo " Deployment: ${DEPLOYMENT_NS}/${DEPLOYMENT_NAME}"
echo " IP : ${TARGET_IP}"
echo " Hostname : ${HOSTNAME_VAL}"