#!/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 # # 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 " >&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}"