From cf244f84a9fad43e86353d75f560de18cab2ea73 Mon Sep 17 00:00:00 2001 From: faten Date: Wed, 16 Apr 2025 15:00:16 +0000 Subject: [PATCH] openstack project --- create_openstack_project.sh | 115 ++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 create_openstack_project.sh diff --git a/create_openstack_project.sh b/create_openstack_project.sh new file mode 100644 index 0000000..2c1f734 --- /dev/null +++ b/create_openstack_project.sh @@ -0,0 +1,115 @@ +#!/bin/bash +# Arrête le script si une commande échoue +set -e +# Arrête le script si une variable est non définie +set -u +# Fait échouer le pipeline si une commande échoue +set -o pipefail + +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 + +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 +