First iteration. Not tested yet.
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# --- Dépendances ---
|
||||
# Vérifier que docopts est installé (pour Bash)
|
||||
if ! command -v docopts &> /dev/null; then
|
||||
echo "❌ Erreur : 'docopts' est requis pour Bash." >&2
|
||||
echo "Installez-le avec : wget https://raw.githubusercontent.com/docopt/docopts/master/docopts && chmod +x docopts && sudo mv docopts /usr/local/bin/" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# --- Usage et documentation ---
|
||||
usage="Usage:
|
||||
$0 <nom_court> [options]
|
||||
|
||||
Options:
|
||||
-h, --help Affiche ce message.
|
||||
-t, --template TEMPLATE Template LXC (ex: local:vztmpl/nixos-unstable-amd64-default_20260428_0830-rootfs.tar.gz).
|
||||
-r, --rootfs-size SIZE Taille du stockage racine (ex: 8G).
|
||||
-c, --cores CORES Nombre de cœurs CPU.
|
||||
-m, --memory MEMORY RAM en Mo.
|
||||
-s, --swap SWAP Swap en Mo.
|
||||
-p, --password PASSWORD Mot de passe root.
|
||||
-b, --bridge BRIDGE Bridge réseau (ex: vmbr0).
|
||||
-v, --vlan VLAN VLAN (ex: tag=10).
|
||||
-d, --domain DOMAIN Domaine DNS.
|
||||
-u, --unprivileged UNPRIV Conteneur non privilégié (0 ou 1).
|
||||
-i, --ip IP IP statique (ex: 192.168.1.100/24).
|
||||
--pve-host HOST Hôte Proxmox (ex: pve).
|
||||
--pve-user USER Utilisateur Proxmox (ex: root).
|
||||
--pve-port PORT Port SSH Proxmox (ex: 22).
|
||||
"
|
||||
|
||||
# --- Paramètres par défaut (variables d'environnement) ---
|
||||
# Serveur Proxmox
|
||||
PVE_HOST="${PVE_HOST:-pve}"
|
||||
PVE_USER="${PVE_USER:-root}"
|
||||
PVE_PORT="${PVE_PORT:-22}"
|
||||
|
||||
# Conteneur LXC
|
||||
TEMPLATE="${TEMPLATE:-local:vztmpl/nixos-unstable-amd64-default_20260428_0830-rootfs.tar.gz}"
|
||||
ROOTFS_SIZE="${ROOTFS_SIZE:-8G}"
|
||||
CORES="${CORES:-2}"
|
||||
MEMORY="${MEMORY:-2048}"
|
||||
SWAP="${SWAP:-1024}"
|
||||
PASSWORD="${PASSWORD:-changeme}"
|
||||
BRIDGE="${BRIDGE:-vmbr0}"
|
||||
VLAN="${VLAN:-}"
|
||||
DOMAIN="${DOMAIN:-lagraula.fr}"
|
||||
UNPRIVILEGED="${UNPRIVILEGED:-0}"
|
||||
IP="${IP:-}"
|
||||
|
||||
# --- Parsing des arguments avec docopts (priorité la plus basse) ---
|
||||
args=$(docopts -h "$usage" : "$@")
|
||||
eval "$args"
|
||||
|
||||
# Nom court de la machine (paramètre obligatoire)
|
||||
SHORT_NAME="${argv[0]:-}"
|
||||
if [ -z "$SHORT_NAME" ]; then
|
||||
echo "❌ Erreur : Le nom court de la machine est obligatoire." >&2
|
||||
echo "$usage" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# --- Surcharge par /etc/nixos-infra/hosts/<nom_court> (priorité moyenne) ---
|
||||
if [ -f "/etc/nixos-infra/hosts/$SHORT_NAME" ]; then
|
||||
echo "📄 Application des paramètres depuis /etc/nixos-infra/hosts/$SHORT_NAME..."
|
||||
set -a
|
||||
source "/etc/nixos-infra/hosts/$SHORT_NAME"
|
||||
set +a
|
||||
fi
|
||||
|
||||
# --- Surcharge par ./<nom_court> (priorité moyenne) ---
|
||||
if [ -f "./$SHORT_NAME" ]; then
|
||||
echo "📄 Application des paramètres depuis ./$SHORT_NAME..."
|
||||
set -a
|
||||
source "./$SHORT_NAME"
|
||||
set +a
|
||||
fi
|
||||
|
||||
# --- Application des arguments de la ligne de commande (priorité la plus haute) ---
|
||||
# On réapplique les valeurs de docopts pour écraser les fichiers de configuration
|
||||
eval "$args"
|
||||
|
||||
# --- Vérification des paramètres critiques ---
|
||||
if [ -z "$TEMPLATE" ] || [ -z "$ROOTFS_SIZE" ] || [ -z "$CORES" ] || \
|
||||
[ -z "$MEMORY" ] || [ -z "$SWAP" ] || [ -z "$PASSWORD" ] || \
|
||||
[ -z "$BRIDGE" ] || [ -z "$DOMAIN" ] || [ -z "$UNPRIVILEGED" ] || \
|
||||
[ -z "$PVE_HOST" ] || [ -z "$PVE_USER" ] || [ -z "$PVE_PORT" ]; then
|
||||
echo "❌ Erreur : Un ou plusieurs paramètres critiques sont manquants." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# --- Connexion SSH au serveur Proxmox ---
|
||||
run_proxmox() {
|
||||
ssh -p "$PVE_PORT" "$PVE_USER@$PVE_HOST" "$1"
|
||||
}
|
||||
|
||||
# --- Construction des options réseau ---
|
||||
NET_OPTS="name=eth0,bridge=$BRIDGE"
|
||||
if [ -n "$VLAN" ]; then
|
||||
NET_OPTS="$NET_OPTS,$VLAN"
|
||||
fi
|
||||
if [ -n "$IP" ]; then
|
||||
NET_OPTS="$NET_OPTS,ip=$IP"
|
||||
fi
|
||||
|
||||
# --- Création du conteneur ---
|
||||
echo "🚀 Création du conteneur LXC $SHORT_NAME sur $PVE_HOST..."
|
||||
LXC_ID=$(run_proxmox "pct create $ROOTFS_SIZE $TEMPLATE --cores $CORES --memory $MEMORY --swap $SWAP --hostname $SHORT_NAME.$DOMAIN --password $PASSWORD --unprivileged $UNPRIVILEGED --net0 $NET_OPTS --onboot 1" | grep -oP '\d+')
|
||||
if [ -z "$LXC_ID" ]; then
|
||||
echo "❌ Erreur : Échec de la création du conteneur." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ Conteneur LXC $SHORT_NAME créé avec succès (ID: $LXC_ID)."
|
||||
Reference in New Issue
Block a user