From e78b3631ce8289c7883078f8ef66b22a681254b8 Mon Sep 17 00:00:00 2001 From: xavier Date: Thu, 30 Apr 2026 10:54:49 +0200 Subject: [PATCH] First iteration. Not tested yet. --- nixos-infra/scripts/create-lxc-nixos.sh | 116 ++++++++++++++++++++++++ 1 file changed, 116 insertions(+) diff --git a/nixos-infra/scripts/create-lxc-nixos.sh b/nixos-infra/scripts/create-lxc-nixos.sh index e69de29..9aa7b33 100644 --- a/nixos-infra/scripts/create-lxc-nixos.sh +++ b/nixos-infra/scripts/create-lxc-nixos.sh @@ -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 [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/ (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 ./ (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)." \ No newline at end of file