Skip to content

Instantly share code, notes, and snippets.

@ixe013
Created November 26, 2025 22:18
Show Gist options
  • Select an option

  • Save ixe013/83c9488f99512a13d40d78b978c761da to your computer and use it in GitHub Desktop.

Select an option

Save ixe013/83c9488f99512a13d40d78b978c761da to your computer and use it in GitHub Desktop.
Vibe coded VM creation script
#!/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