diff --git a/helm/cert-manager-webhook-ovh/ops/values.yaml b/helm/cert-manager-webhook-ovh/ops/values.yaml index e5a6196..4066122 100644 --- a/helm/cert-manager-webhook-ovh/ops/values.yaml +++ b/helm/cert-manager-webhook-ovh/ops/values.yaml @@ -81,54 +81,34 @@ cert-manager-webhook-ovh: name: cert-manager-webhook-ovh key: consumer-key - # Important pour vos domaines spécifiques - # Note : Vérifiez si votre chart supporte les selectors via values, - # sinon il faudra peut-être patcher le template. - -# Configuration des credentials OVH (si External Secrets n'est pas utilisé) -# Ces valeurs sont utilisées uniquement si externalSecret.enabled = false -ovhCredentials: - applicationKey: "" # Application Key OVH (laisser vide si vous utilisez External Secrets) - applicationSecret: "" # Application Secret OVH (laisser vide si vous utilisez External Secrets) - consumerKey: "" # Consumer Key OVH (laisser vide si vous utilisez External Secrets) - # Configuration External Secrets Operator - Stratégie Multi-Namespace # Cette configuration permet de partager les secrets OVH entre cert-manager-ops et cert-manager-webhook-ovh-ops # en utilisant un ClusterSecretStore et des ExternalSecrets dans chaque namespace externalSecret: - enabled: false # Activez cette option pour utiliser External Secrets + enabled: true # ✅ Activé pour utiliser External Secrets avec Vault refreshInterval: "1h" # Intervalle de rafraîchissement du secret secretName: "cert-manager-webhook-ovh" # Nom du Secret créé dans chaque namespace # Références aux clés dans Vault + # Format: "chemin/dans/vault#clef" pour KV v2 + # Exemple: "secret/data/ovh#application-key" remoteRef: - applicationKey: "" # Chemin/clef dans Vault pour application-key (ex: "secret/data/ovh#application-key") - applicationSecret: "" # Chemin/clef dans Vault pour application-secret (ex: "secret/data/ovh#application-secret") - consumerKey: "" # Chemin/clef dans Vault pour consumer-key (ex: "secret/data/ovh#consumer-key") + applicationKey: "secret/data/ovh#application-key" # ⚠️ À configurer avec votre chemin Vault + applicationSecret: "secret/data/ovh#application-secret" # ⚠️ À configurer avec votre chemin Vault + consumerKey: "secret/data/ovh#consumer-key" # ⚠️ À configurer avec votre chemin Vault # Configuration HashiCorp Vault vault: secretStoreName: "vault-backend" # Nom du ClusterSecretStore à créer - server: "https://vault.example.com:8200" # URL de votre serveur Vault + server: "http://hashicorp-vault-0.hashicorp-vault-internal.hashicorp-ops.svc.cluster.local:8200" # ⚠️ À configurer avec l'URL de votre serveur Vault path: "secret" # Chemin du secret engine (secret, kv, etc.) version: "v2" # Version de l'API KV (v1 ou v2) auth: # Authentification Kubernetes (recommandé pour la stratégie Multi-Namespace) kubernetes: mountPath: "kubernetes" # Chemin du mount Kubernetes dans Vault - role: "" # Nom du rôle Vault configuré pour Kubernetes auth + role: "cert-manager-webhook-ovh-role" # ⚠️ Nom du rôle Vault configuré pour Kubernetes auth # Le ServiceAccount doit être autorisé dans les namespaces cert-manager-ops et cert-manager-webhook-ovh-ops serviceAccountRef: name: "cert-manager-webhook-ovh-sa" # ServiceAccount utilisé pour l'authentification - namespace: "cert-manager-webhook-ovh-ops" # Namespace du ServiceAccount - # Alternative : Authentification par token - # token: - # secretName: "vault-token" # Nom du Secret contenant le token - # secretKey: "token" # Clé dans le Secret - # Alternative : Authentification AppRole - # appRole: - # path: "approle" - # roleId: "" # Role ID - # secretRef: - # name: "vault-approle-secret" # Secret contenant le Secret ID - # key: "secretId" + namespace: "cert-manager-webhook-ovh-ops" # Namespace du ServiceAccount \ No newline at end of file diff --git a/scripts/verify-external-secrets.sh b/scripts/verify-external-secrets.sh new file mode 100644 index 0000000..1e9098a --- /dev/null +++ b/scripts/verify-external-secrets.sh @@ -0,0 +1,160 @@ +#!/bin/bash +# Script de vérification des ExternalSecrets pour cert-manager-webhook-ovh + +set -e + +# Détection automatique du contexte si non fourni +if [ -z "$1" ]; then + # Essayer de détecter le contexte actuel + CURRENT_CONTEXT=$(kubectl config current-context 2>/dev/null || echo "") + if [ -n "$CURRENT_CONTEXT" ]; then + CONTEXT="$CURRENT_CONTEXT" + echo "⚠️ Aucun contexte spécifié, utilisation du contexte actuel: $CONTEXT" + else + CONTEXT="" + echo "⚠️ Aucun contexte kubectl trouvé. Les commandes seront exécutées sans --context" + fi +else + CONTEXT="$1" +fi + +# Fonction pour exécuter kubectl avec ou sans contexte +kubectl_cmd() { + if [ -n "$CONTEXT" ]; then + kubectl "$@" --context="$CONTEXT" + else + kubectl "$@" + fi +} +SECRET_NAME="${2:-cert-manager-webhook-ovh}" +NAMESPACE_WEBHOOK="${3:-cert-manager-webhook-ovh-ops}" +NAMESPACE_CERTMANAGER="${4:-cert-manager-ops}" +SECRET_STORE_NAME="${5:-vault-backend}" + +echo "=== Vérification des ExternalSecrets pour cert-manager-webhook-ovh ===" +echo "Contexte: $CONTEXT" +echo "" + +# 1. Vérifier le ClusterSecretStore +echo "1. Vérification du ClusterSecretStore '$SECRET_STORE_NAME'..." +if kubectl_cmd get clustersecretstore "$SECRET_STORE_NAME" &>/dev/null; then + echo " ✅ ClusterSecretStore trouvé" + kubectl_cmd get clustersecretstore "$SECRET_STORE_NAME" -o wide + echo "" + + # Afficher les détails + echo " Détails du ClusterSecretStore:" + kubectl_cmd describe clustersecretstore "$SECRET_STORE_NAME" | grep -A 20 "Spec:" || true + echo "" +else + echo " ❌ ClusterSecretStore '$SECRET_STORE_NAME' non trouvé" + echo "" +fi + +# 2. Vérifier les ExternalSecrets +echo "2. Vérification des ExternalSecrets..." + +# Dans cert-manager-webhook-ovh-ops +echo " a) Dans le namespace '$NAMESPACE_WEBHOOK':" +if kubectl_cmd get externalsecret "$SECRET_NAME" -n "$NAMESPACE_WEBHOOK" &>/dev/null; then + echo " ✅ ExternalSecret trouvé" + kubectl_cmd get externalsecret "$SECRET_NAME" -n "$NAMESPACE_WEBHOOK" -o wide + echo "" + + # Afficher le statut + echo " Statut:" + kubectl_cmd get externalsecret "$SECRET_NAME" -n "$NAMESPACE_WEBHOOK" -o jsonpath='{.status}' | jq '.' 2>/dev/null || \ + kubectl_cmd describe externalsecret "$SECRET_NAME" -n "$NAMESPACE_WEBHOOK" | grep -A 10 "Status:" || true + echo "" +else + echo " ❌ ExternalSecret '$SECRET_NAME' non trouvé dans '$NAMESPACE_WEBHOOK'" + echo "" +fi + +# Dans cert-manager-ops +echo " b) Dans le namespace '$NAMESPACE_CERTMANAGER':" +if kubectl_cmd get externalsecret "$SECRET_NAME" -n "$NAMESPACE_CERTMANAGER" &>/dev/null; then + echo " ✅ ExternalSecret trouvé" + kubectl_cmd get externalsecret "$SECRET_NAME" -n "$NAMESPACE_CERTMANAGER" -o wide + echo "" + + # Afficher le statut + echo " Statut:" + kubectl_cmd get externalsecret "$SECRET_NAME" -n "$NAMESPACE_CERTMANAGER" -o jsonpath='{.status}' | jq '.' 2>/dev/null || \ + kubectl_cmd describe externalsecret "$SECRET_NAME" -n "$NAMESPACE_CERTMANAGER" | grep -A 10 "Status:" || true + echo "" +else + echo " ❌ ExternalSecret '$SECRET_NAME' non trouvé dans '$NAMESPACE_CERTMANAGER'" + echo "" +fi + +# 3. Vérifier les Secrets créés +echo "3. Vérification des Secrets créés par External Secrets..." + +# Dans cert-manager-webhook-ovh-ops +echo " a) Secret dans '$NAMESPACE_WEBHOOK':" +if kubectl_cmd get secret "$SECRET_NAME" -n "$NAMESPACE_WEBHOOK" &>/dev/null; then + echo " ✅ Secret trouvé" + kubectl_cmd get secret "$SECRET_NAME" -n "$NAMESPACE_WEBHOOK" -o wide + echo "" + + # Vérifier les clés présentes + echo " Clés présentes dans le secret:" + kubectl_cmd get secret "$SECRET_NAME" -n "$NAMESPACE_WEBHOOK" -o jsonpath='{.data}' | jq 'keys' 2>/dev/null || \ + kubectl_cmd get secret "$SECRET_NAME" -n "$NAMESPACE_WEBHOOK" -o jsonpath='{.data}' | grep -o '"[^"]*":' | sed 's/"//g' | sed 's/://g' || true + echo "" +else + echo " ❌ Secret '$SECRET_NAME' non trouvé dans '$NAMESPACE_WEBHOOK'" + echo " ⚠️ Le secret sera créé automatiquement par External Secrets une fois la synchronisation réussie" + echo "" +fi + +# Dans cert-manager-ops +echo " b) Secret dans '$NAMESPACE_CERTMANAGER':" +if kubectl_cmd get secret "$SECRET_NAME" -n "$NAMESPACE_CERTMANAGER" &>/dev/null; then + echo " ✅ Secret trouvé" + kubectl_cmd get secret "$SECRET_NAME" -n "$NAMESPACE_CERTMANAGER" -o wide + echo "" + + # Vérifier les clés présentes + echo " Clés présentes dans le secret:" + kubectl_cmd get secret "$SECRET_NAME" -n "$NAMESPACE_CERTMANAGER" -o jsonpath='{.data}' | jq 'keys' 2>/dev/null || \ + kubectl_cmd get secret "$SECRET_NAME" -n "$NAMESPACE_CERTMANAGER" -o jsonpath='{.data}' | grep -o '"[^"]*":' | sed 's/"//g' | sed 's/://g' || true + echo "" +else + echo " ❌ Secret '$SECRET_NAME' non trouvé dans '$NAMESPACE_CERTMANAGER'" + echo " ⚠️ Le secret sera créé automatiquement par External Secrets une fois la synchronisation réussie" + echo "" +fi + +# 4. Vérifier les événements et logs d'External Secrets Operator +echo "4. Vérification des événements récents..." +echo " Événements pour ExternalSecret dans '$NAMESPACE_CERTMANAGER':" +kubectl_cmd get events -n "$NAMESPACE_CERTMANAGER" \ + --field-selector involvedObject.name="$SECRET_NAME" \ + --sort-by='.lastTimestamp' | tail -5 || echo " Aucun événement récent" +echo "" + +# 5. Résumé +echo "=== Résumé ===" +echo "" +echo "Pour voir les détails complets d'un ExternalSecret:" +if [ -n "$CONTEXT" ]; then + echo " kubectl describe externalsecret $SECRET_NAME -n $NAMESPACE_CERTMANAGER --context=$CONTEXT" + echo "" + echo "Pour voir les logs d'External Secrets Operator:" + echo " kubectl logs -n external-secrets-system -l app.kubernetes.io/name=external-secrets --context=$CONTEXT --tail=50" + echo "" + echo "Pour forcer une synchronisation immédiate:" + echo " kubectl annotate externalsecret $SECRET_NAME -n $NAMESPACE_CERTMANAGER --context=$CONTEXT force-sync=\$(date +%s) --overwrite" +else + echo " kubectl describe externalsecret $SECRET_NAME -n $NAMESPACE_CERTMANAGER" + echo "" + echo "Pour voir les logs d'External Secrets Operator:" + echo " kubectl logs -n external-secrets-system -l app.kubernetes.io/name=external-secrets --tail=50" + echo "" + echo "Pour forcer une synchronisation immédiate:" + echo " kubectl annotate externalsecret $SECRET_NAME -n $NAMESPACE_CERTMANAGER force-sync=\$(date +%s) --overwrite" +fi +echo "" +