update sync scripts

This commit is contained in:
2026-01-22 03:24:17 +01:00
parent 2b795aac93
commit a2208b9360
2 changed files with 134 additions and 40 deletions

View File

@@ -43,10 +43,12 @@ echo "=== Synchronisation automatique des secrets TLS ==="
echo "Source: $SOURCE_CLUSTER (namespace: $SOURCE_NS)"
echo ""
# Fonction pour déterminer les namespaces cibles pour un certificat wildcard
# Les certificats wildcard doivent être copiés dans tous les namespaces qui les utilisent
# Fonction pour déterminer automatiquement les namespaces cibles pour un certificat wildcard
# Détecte automatiquement tous les namespaces qui référencent ce secret dans leurs Ingress/IngressRoute
get_wildcard_target_namespaces() {
local cert_name=$1
local secret_name=$2
local target_cluster=$3
local env=""
# Extraire l'environnement depuis le nom du certificat
@@ -60,22 +62,59 @@ get_wildcard_target_namespaces() {
return 1
fi
# Liste des namespaces qui utilisent le certificat wildcard pour cet environnement
# Ajoutez ici tous les namespaces qui référencent ce secret dans leurs Ingress
case "$env" in
dev)
WILDCARD_TARGET_NAMESPACES=("headlamp-dev" "homarr-dev" "longhorn-dev")
;;
rct)
WILDCARD_TARGET_NAMESPACES=("headlamp-rct" "homarr-rct" "longhorn-rct")
;;
prd)
WILDCARD_TARGET_NAMESPACES=("headlamp-prd" "homarr-prd" "longhorn-prd")
;;
*)
echo " 🔍 Détection automatique des namespaces utilisant $secret_name..."
# Initialiser le tableau des namespaces cibles
WILDCARD_TARGET_NAMESPACES=()
# Récupérer tous les namespaces du cluster cible
local namespaces
if [ -z "$target_cluster" ]; then
namespaces=$(kubectl get namespaces -o jsonpath='{.items[*].metadata.name}' 2>/dev/null)
else
namespaces=$(kubectl get namespaces --context="$target_cluster" -o jsonpath='{.items[*].metadata.name}' 2>/dev/null)
fi
if [ -z "$namespaces" ]; then
echo " ⚠️ Aucun namespace trouvé dans le cluster $target_cluster"
return 1
;;
esac
fi
# Pour chaque namespace, vérifier s'il contient des Ingress ou IngressRoute qui référencent le secret
for ns in $namespaces; do
# Ignorer les namespaces système
if [[ "$ns" =~ ^(kube-system|kube-public|kube-node-lease|default)$ ]]; then
continue
fi
# Vérifier les Ingress (ressource standard Kubernetes)
local ingress_found=false
if [ -z "$target_cluster" ]; then
ingress_found=$(kubectl get ingress -n "$ns" -o json 2>/dev/null | jq -r --arg secret "$secret_name" '.items[] | select(.spec.tls[]?.secretName == $secret) | .metadata.name' 2>/dev/null | head -1)
else
ingress_found=$(kubectl get ingress -n "$ns" --context="$target_cluster" -o json 2>/dev/null | jq -r --arg secret "$secret_name" '.items[] | select(.spec.tls[]?.secretName == $secret) | .metadata.name' 2>/dev/null | head -1)
fi
# Vérifier les IngressRoute (Traefik CRD)
local ingressroute_found=false
if [ -z "$target_cluster" ]; then
ingressroute_found=$(kubectl get ingressroute -n "$ns" -o json 2>/dev/null | jq -r --arg secret "$secret_name" '.items[] | select(.spec.tls.secretName == $secret) | .metadata.name' 2>/dev/null | head -1)
else
ingressroute_found=$(kubectl get ingressroute -n "$ns" --context="$target_cluster" -o json 2>/dev/null | jq -r --arg secret "$secret_name" '.items[] | select(.spec.tls.secretName == $secret) | .metadata.name' 2>/dev/null | head -1)
fi
# Si le secret est référencé dans ce namespace, l'ajouter à la liste
if [ -n "$ingress_found" ] || [ -n "$ingressroute_found" ]; then
WILDCARD_TARGET_NAMESPACES+=("$ns")
echo "$ns (détecté via Ingress/IngressRoute)"
fi
done
if [ ${#WILDCARD_TARGET_NAMESPACES[@]} -eq 0 ]; then
echo " ⚠️ Aucun namespace n'utilise actuellement le secret $secret_name"
echo " Le secret sera synchronisé lors de la prochaine utilisation"
return 0 # Ne pas échouer, juste avertir
fi
return 0
}
@@ -281,8 +320,8 @@ for i in $(seq 0 $((CERT_COUNT - 1))); do
if [ "$IS_WILDCARD" = true ]; then
echo " 🌐 Certificat wildcard détecté"
# Obtenir la liste des namespaces cibles
if ! get_wildcard_target_namespaces "$CERT_NAME"; then
# Obtenir la liste des namespaces cibles (détection automatique)
if ! get_wildcard_target_namespaces "$CERT_NAME" "$SECRET_NAME" "$TARGET_CLUSTER"; then
echo " ⚠️ Impossible de déterminer les namespaces cibles pour le wildcard"
rm -f "$TEMP_FILE"
SKIP_COUNT=$((SKIP_COUNT + 1))
@@ -290,6 +329,14 @@ for i in $(seq 0 $((CERT_COUNT - 1))); do
continue
fi
if [ ${#WILDCARD_TARGET_NAMESPACES[@]} -eq 0 ]; then
echo " Aucun namespace n'utilise actuellement ce certificat"
rm -f "$TEMP_FILE"
SKIP_COUNT=$((SKIP_COUNT + 1))
echo ""
continue
fi
echo " Destination: $TARGET_CLUSTER (namespaces: ${WILDCARD_TARGET_NAMESPACES[*]})"
# Copier le secret dans chaque namespace cible

View File

@@ -43,10 +43,12 @@ echo "=== Synchronisation automatique des secrets TLS ==="
echo "Source: $SOURCE_CLUSTER (namespace: $SOURCE_NS)"
echo ""
# Fonction pour déterminer les namespaces cibles pour un certificat wildcard
# Les certificats wildcard doivent être copiés dans tous les namespaces qui les utilisent
# Fonction pour déterminer automatiquement les namespaces cibles pour un certificat wildcard
# Détecte automatiquement tous les namespaces qui référencent ce secret dans leurs Ingress/IngressRoute
get_wildcard_target_namespaces() {
local cert_name=$1
local secret_name=$2
local target_cluster=$3
local env=""
# Extraire l'environnement depuis le nom du certificat
@@ -60,22 +62,59 @@ get_wildcard_target_namespaces() {
return 1
fi
# Liste des namespaces qui utilisent le certificat wildcard pour cet environnement
# Ajoutez ici tous les namespaces qui référencent ce secret dans leurs Ingress
case "$env" in
dev)
WILDCARD_TARGET_NAMESPACES=("headlamp-dev" "homarr-dev" "longhorn-dev")
;;
rct)
WILDCARD_TARGET_NAMESPACES=("headlamp-rct" "homarr-rct" "longhorn-rct")
;;
prd)
WILDCARD_TARGET_NAMESPACES=("headlamp-prd" "homarr-prd" "longhorn-prd")
;;
*)
echo " 🔍 Détection automatique des namespaces utilisant $secret_name..."
# Initialiser le tableau des namespaces cibles
WILDCARD_TARGET_NAMESPACES=()
# Récupérer tous les namespaces du cluster cible
local namespaces
if [ -z "$target_cluster" ]; then
namespaces=$(kubectl get namespaces -o jsonpath='{.items[*].metadata.name}' 2>/dev/null)
else
namespaces=$(kubectl get namespaces --context="$target_cluster" -o jsonpath='{.items[*].metadata.name}' 2>/dev/null)
fi
if [ -z "$namespaces" ]; then
echo " ⚠️ Aucun namespace trouvé dans le cluster $target_cluster"
return 1
;;
esac
fi
# Pour chaque namespace, vérifier s'il contient des Ingress ou IngressRoute qui référencent le secret
for ns in $namespaces; do
# Ignorer les namespaces système
if [[ "$ns" =~ ^(kube-system|kube-public|kube-node-lease|default)$ ]]; then
continue
fi
# Vérifier les Ingress (ressource standard Kubernetes)
local ingress_found=false
if [ -z "$target_cluster" ]; then
ingress_found=$(kubectl get ingress -n "$ns" -o json 2>/dev/null | jq -r --arg secret "$secret_name" '.items[] | select(.spec.tls[]?.secretName == $secret) | .metadata.name' 2>/dev/null | head -1)
else
ingress_found=$(kubectl get ingress -n "$ns" --context="$target_cluster" -o json 2>/dev/null | jq -r --arg secret "$secret_name" '.items[] | select(.spec.tls[]?.secretName == $secret) | .metadata.name' 2>/dev/null | head -1)
fi
# Vérifier les IngressRoute (Traefik CRD)
local ingressroute_found=false
if [ -z "$target_cluster" ]; then
ingressroute_found=$(kubectl get ingressroute -n "$ns" -o json 2>/dev/null | jq -r --arg secret "$secret_name" '.items[] | select(.spec.tls.secretName == $secret) | .metadata.name' 2>/dev/null | head -1)
else
ingressroute_found=$(kubectl get ingressroute -n "$ns" --context="$target_cluster" -o json 2>/dev/null | jq -r --arg secret "$secret_name" '.items[] | select(.spec.tls.secretName == $secret) | .metadata.name' 2>/dev/null | head -1)
fi
# Si le secret est référencé dans ce namespace, l'ajouter à la liste
if [ -n "$ingress_found" ] || [ -n "$ingressroute_found" ]; then
WILDCARD_TARGET_NAMESPACES+=("$ns")
echo "$ns (détecté via Ingress/IngressRoute)"
fi
done
if [ ${#WILDCARD_TARGET_NAMESPACES[@]} -eq 0 ]; then
echo " ⚠️ Aucun namespace n'utilise actuellement le secret $secret_name"
echo " Le secret sera synchronisé lors de la prochaine utilisation"
return 0 # Ne pas échouer, juste avertir
fi
return 0
}
@@ -281,8 +320,8 @@ for i in $(seq 0 $((CERT_COUNT - 1))); do
if [ "$IS_WILDCARD" = true ]; then
echo " 🌐 Certificat wildcard détecté"
# Obtenir la liste des namespaces cibles
if ! get_wildcard_target_namespaces "$CERT_NAME"; then
# Obtenir la liste des namespaces cibles (détection automatique)
if ! get_wildcard_target_namespaces "$CERT_NAME" "$SECRET_NAME" "$TARGET_CLUSTER"; then
echo " ⚠️ Impossible de déterminer les namespaces cibles pour le wildcard"
rm -f "$TEMP_FILE"
SKIP_COUNT=$((SKIP_COUNT + 1))
@@ -290,6 +329,14 @@ for i in $(seq 0 $((CERT_COUNT - 1))); do
continue
fi
if [ ${#WILDCARD_TARGET_NAMESPACES[@]} -eq 0 ]; then
echo " Aucun namespace n'utilise actuellement ce certificat"
rm -f "$TEMP_FILE"
SKIP_COUNT=$((SKIP_COUNT + 1))
echo ""
continue
fi
echo " Destination: $TARGET_CLUSTER (namespaces: ${WILDCARD_TARGET_NAMESPACES[*]})"
# Copier le secret dans chaque namespace cible