#!/bin/bash set -o pipefail echo ">>>>>> DEBUG: Liste des variables d'environnement reçues par le script <<<<<<" env | sort echo ">>>>>>>>>>>>>>>>>>>> FIN DEBUG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" DEFAULT_OPENSTACK_DOMAIN="default" DEFAULT_USER_ROLE="_member_" PROJECT_NAME="${PROJECT_NAME:?Le nom du projet (variable PROJECT_NAME) est requis}" QUOTA_INSTANCES="${QUOTA_INSTANCES:?Le quota d'instances (variable QUOTA_INSTANCES) est requis}" QUOTA_CORES="${QUOTA_CORES:?Le quota de CPU/cores (variable QUOTA_CORES) est requis}" QUOTA_RAM="${QUOTA_RAM:?Le quota de RAM (variable QUOTA_RAM en MB) est requis}" QUOTA_VOLUMES="${QUOTA_VOLUMES:?Le quota de volumes (variable QUOTA_VOLUMES) est requis}" QUOTA_VOLUME_SNAPSHOTS="${QUOTA_VOLUME_SNAPSHOTS:?Le quota de snapshots de volume (variable QUOTA_VOLUME_SNAPSHOTS) est requis}" QUOTA_VOLUME_GIGABYTES="${QUOTA_VOLUME_GIGABYTES:?Le quota de stockage volume (variable QUOTA_VOLUME_GIGABYTES) est requis}" QUOTA_FLOATING_IPS="${QUOTA_FLOATING_IPS:?Le quota d'IPs flottantes (variable QUOTA_FLOATING_IPS) est requis}" QUOTA_SECURITY_GROUPS="${QUOTA_SECURITY_GROUPS:?Le quota de groupes de sécurité (variable QUOTA_SECURITY_GROUPS) est requis}" QUOTA_SECURITY_GROUP_RULES="${QUOTA_SECURITY_GROUP_RULES:?Le quota de règles de sécurité (variable QUOTA_SECURITY_GROUP_RULES) est requis}" QUOTA_NETWORKS="${QUOTA_NETWORKS:?Le quota de réseaux (variable QUOTA_NETWORKS) est requis}" QUOTA_PORTS="${QUOTA_PORTS:?Le quota de ports (variable QUOTA_PORTS) est requis}" QUOTA_ROUTERS="${QUOTA_ROUTERS:?Le quota de routeurs (variable QUOTA_ROUTERS) est requis}" PROJECT_DESCRIPTION="${PROJECT_DESCRIPTION:-""}" USER_EMAILS="${USER_EMAILS:-""}" # --- Vérification des dépendances --- if ! command -v openstack &> /dev/null; then echo "ERREUR: La commande 'openstack' est introuvable. Le client OpenStack doit être installé." exit 1 fi if ! command -v jq &> /dev/null; then echo "ERREUR: La commande 'jq' est introuvable. jq doit être installé pour parser le JSON." exit 1 fi # Afficher la liste des rôles disponibles echo "--- Liste des rôles disponibles dans OpenStack ---" openstack role list -f table -c ID -c Name echo "--- Fin de la liste des rôles ---" echo "--- Début de la création du projet OpenStack ---" echo "Nom du projet: ${PROJECT_NAME}" echo "Description: ${PROJECT_DESCRIPTION}" echo "Domaine OpenStack: ${DEFAULT_OPENSTACK_DOMAIN}" echo "1. Création du projet..." # Vérifier si le projet existe if openstack project show "${PROJECT_NAME}" --domain "${DEFAULT_OPENSTACK_DOMAIN}" > /dev/null 2>&1; then echo "ERREUR: Le projet '${PROJECT_NAME}' existe déjà dans le domaine '${DEFAULT_OPENSTACK_DOMAIN}'." exit 1 fi PROJECT_OUTPUT=$(openstack project create --domain "${DEFAULT_OPENSTACK_DOMAIN}" --description "${PROJECT_DESCRIPTION}" -f json "${PROJECT_NAME}") PROJECT_ID=$(echo "${PROJECT_OUTPUT}" | jq -r '.id') if [ -z "${PROJECT_ID}" ]; then echo "ERREUR: Impossible de créer le projet '${PROJECT_NAME}' ou de récupérer son ID." exit 1 fi echo "Projet '${PROJECT_NAME}' créé avec succès. ID: ${PROJECT_ID}" #Définir les quotas pour le projet echo "2. Définition des quotas pour le projet ID ${PROJECT_ID}..." if openstack quota set --quiet \ --instances "${QUOTA_INSTANCES}" \ --cores "${QUOTA_CORES}" \ --ram "${QUOTA_RAM}" \ --volumes "${QUOTA_VOLUMES}" \ --snapshots "${QUOTA_VOLUME_SNAPSHOTS}" \ --gigabytes "${QUOTA_VOLUME_GIGABYTES}" \ --floating-ips "${QUOTA_FLOATING_IPS}" \ --secgroups "${QUOTA_SECURITY_GROUPS}" \ --secgroup-rules "${QUOTA_SECURITY_GROUP_RULES}" \ --networks "${QUOTA_NETWORKS}" \ --ports "${QUOTA_PORTS}" \ --routers "${QUOTA_ROUTERS}" \ "${PROJECT_ID}"; then echo "Quotas définis avec succès." else echo "ERREUR: Échec de la définition des quotas pour le projet ${PROJECT_ID}." exit 1 fi # Ajouter les utilisateurs au projet (si spécifiés) if [ -n "${USER_EMAILS}" ]; then echo "3. Ajout des utilisateurs au projet (Rôle: ${DEFAULT_USER_ROLE})..." # Convertir la liste d'emails séparés par des virgules en un tableau Bash IFS=',' read -r -a email_array <<< "${USER_EMAILS}" for email in "${email_array[@]}"; do # Nettoyer l'email (enlever les espaces potentiels au début/fin) clean_email=$(echo "${email}" | xargs) if [ -z "${clean_email}" ]; then continue # Ignorer les emails vides fi echo " - Recherche de l'utilisateur OpenStack pour l'email: ${clean_email} dans le domaine ${DEFAULT_OPENSTACK_DOMAIN}..." USER_ID=$(openstack user list --domain "${DEFAULT_OPENSTACK_DOMAIN}" --long -f json | jq -r --arg email "${clean_email}" '.[] | select(.Email == $email or .Name == $email) | .ID' | head -n 1) if [ -n "${USER_ID}" ]; then USER_NAME=$(openstack user show ${USER_ID} --domain "${DEFAULT_OPENSTACK_DOMAIN}" -f value -c name) echo " Utilisateur trouvé: Nom='${USER_NAME}', ID='${USER_ID}'. Assignation du rôle..." # Assigner le rôle à l'utilisateur pour ce projet if openstack role add --project "${PROJECT_ID}" --user "${USER_ID}" --user-domain "${DEFAULT_OPENSTACK_DOMAIN}" "${DEFAULT_USER_ROLE}"; then echo " Rôle '${DEFAULT_USER_ROLE}' assigné avec succès à l'utilisateur '${USER_NAME}' pour le projet '${PROJECT_NAME}'." else echo " ATTENTION: Impossible d'assigner le rôle '${DEFAULT_USER_ROLE}' à l'utilisateur '${USER_NAME}' (ID: ${USER_ID}) pour le projet '${PROJECT_NAME}'. Vérifiez si l'utilisateur ou le rôle existe et les permissions." fi else echo " ATTENTION: Utilisateur OpenStack non trouvé pour l'email/nom '${clean_email}' dans le domaine '${DEFAULT_OPENSTACK_DOMAIN}'. L'utilisateur doit exister dans OpenStack pour être ajouté au projet." fi done echo "Traitement des utilisateurs terminé." else echo "3. Aucun utilisateur spécifié (USER_EMAILS vide) à ajouter au projet." fi echo "--- Création du projet OpenStack terminée avec succès ---" echo "ID du Projet OpenStack: ${PROJECT_ID}" exit 0