SemaphoreOpenStack/create_openstack_project.sh
2025-05-05 08:17:37 +00:00

123 lines
5.9 KiB
Bash

#!/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