Created
November 26, 2025 22:18
-
-
Save ixe013/83c9488f99512a13d40d78b978c761da to your computer and use it in GitHub Desktop.
Vibe coded VM creation script
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| # ========================================== | |
| # 1. CONFIGURATION | |
| # ========================================== | |
| # Utilisation de valeurs par défaut si non définies dans l'environnement | |
| : ${VM_NAME:=ma-vm-debian} | |
| : ${IMAGE_URL:=https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-amd64.qcow2} | |
| : ${BASE_IMG:=debian-12-base.qcow2} | |
| : ${DISK_IMG:="${VM_NAME}.qcow2"} | |
| : ${USER_DATA:=user-data.yaml} | |
| : ${SEED_ISO:=seed.iso} | |
| : ${SETUP_PASSWORD:=password123} | |
| : ${PASSWORD_HASH:=$(openssl passwd -6 ${SETUP_PASSWORD})} | |
| # ========================================== | |
| # 2. EARLY RETURN (SOURCING) | |
| # ========================================== | |
| # Si le script est sourcé (ex: . ./script.sh), on s'arrête ici | |
| # Cela permet de charger les variables sans lancer la VM | |
| return 2> /dev/null | |
| # ========================================== | |
| # 3. PRÉPARATION | |
| # ========================================== | |
| # Téléchargement conditionnel | |
| if [ ! -f "$BASE_IMG" ]; then | |
| echo "⬇️ Téléchargement de l'image Debian 12 Cloud..." | |
| wget -O "$BASE_IMG" "$IMAGE_URL" | |
| else | |
| echo "✅ Image de base déjà présente." | |
| fi | |
| # Génération Cloud-init | |
| cat <<EOF > "$USER_DATA" | |
| #cloud-config | |
| hostname: $VM_NAME | |
| package_update: true | |
| packages: | |
| - curl | |
| - openssh-server | |
| users: | |
| - name: setup | |
| shell: /bin/bash | |
| sudo: ALL=(ALL) NOPASSWD:ALL | |
| hashed_passwd: ${PASSWORD_HASH} | |
| lock_passwd: false | |
| groups: users | |
| - name: root | |
| lock_passwd: false | |
| shell: /bin/bash | |
| chpasswd: | |
| expire: false | |
| users: | |
| - {name: setup, hashed_password: password1, type: text} | |
| - {name: user1, password: password1, type: text} | |
| - {name: user2, password: $6$rounds=4096$5DJ8a9WMTEzIo5J4$Yms6imfeBvf3Yfu84mQBerh18l7OR1Wm1BJXZqFSpJ6BVas0AYJqIjP7czkOaAZHZi1kxQ5Y1IhgWN8K9NgxR1} | |
| ssh_pwauth: false | |
| # Autoriser l'authentification par mot de passe pour SSH (souvent désactivé par défaut sur le cloud) | |
| ssh_pwauth: true | |
| runcmd: | |
| - systemctl start serial-getty@ttyS0.service | |
| EOF | |
| echo "✅ Configuration Cloud-init générée." | |
| # Création de l'ISO de configuration | |
| cloud-localds "$SEED_ISO" "$USER_DATA" | |
| # Création du disque de la VM (Overlay) | |
| if [ ! -f "$DISK_IMG" ]; then | |
| echo qemu-img create -f qcow2 -F qcow2 -b "$(pwd)/$BASE_IMG" "$DISK_IMG" 10G | |
| qemu-img create -f qcow2 -F qcow2 -b "$(pwd)/$BASE_IMG" "$DISK_IMG" 10G | |
| echo "✅ Disque virtuel créé." | |
| else | |
| echo "⚠️ Le disque $DISK_IMG existe déjà, on le réutilise." | |
| fi | |
| # ========================================== | |
| # 4. GESTION DES PERMISSIONS (ACL) | |
| # ========================================== | |
| echo "🔓 Application des permissions pour libvirt-qemu..." | |
| QEMU_USER="libvirt-qemu" | |
| TARGET_DIR=$(pwd) | |
| # Boucle pour remonter l'arborescence jusqu'à /home | |
| # On donne le droit de traverser (x) à chaque dossier parent | |
| dir_ptr="$TARGET_DIR" | |
| while [ "$dir_ptr" != "/" ]; do | |
| # On évite d'aller trop haut inutilement (ex: ne pas toucher à / si possible, mais /home est nécessaire) | |
| if [[ "$dir_ptr" == "/home"* ]] || [[ "$dir_ptr" == "$TARGET_DIR" ]]; then | |
| sudo setfacl -m u:$QEMU_USER:x "$dir_ptr" | |
| fi | |
| dir_ptr=$(dirname "$dir_ptr") | |
| done | |
| # Droits explicites sur les fichiers | |
| sudo setfacl -m u:$QEMU_USER:rw "$DISK_IMG" | |
| sudo setfacl -m u:$QEMU_USER:r "$BASE_IMG" | |
| sudo setfacl -m u:$QEMU_USER:r "$SEED_ISO" | |
| echo "✅ Permissions ACL appliquées sur toute la chaîne de dossiers." | |
| # ========================================== | |
| # 5. LANCEMENT | |
| # ========================================== | |
| echo "🚀 Lancement de la VM $VM_NAME..." | |
| echo "ℹ️ Pour quitter la console sans éteindre la VM : CTRL + ]" | |
| echo "ℹ️ user: setup, password: ${SETUP_PASSWORD}" | |
| sudo virt-install \ | |
| --name "$VM_NAME" \ | |
| --memory 1024 \ | |
| --vcpus 1 \ | |
| --disk path="$(pwd)/$DISK_IMG",device=disk,bus=virtio \ | |
| --disk path="$(pwd)/$SEED_ISO",device=cdrom \ | |
| --os-variant debian12 \ | |
| --graphics none \ | |
| --autoconsole text \ | |
| --network network=default,model=virtio \ | |
| --import |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment