Последняя активность 3 weeks ago

Working version of my proxmox template creation script. It'll be used to provision Packer with necessary templates in order to build it's image.

Версия f4d78a827d4f1c82c86d1a0ca89d432fbe8f91b4

create-pve-template.sh Исходник
1#!/bin/bash
2set -e
3
4TEMPLATE_URL="https://cloud-images.ubuntu.com/plucky/current/plucky-server-cloudimg-amd64.img"
5VMID=9000
6TEMPLATE_NAME="ubuntu-25.04-cloudimg-temp"
7STORAGE="local-lvm"
8SKIP_DISK_SETUP=false
9
10# Parser avec getopt
11OPTS=$(getopt -o "" --long vmid:,template:,storage:,skip-disk -n 'script' -- "$@")
12eval set -- "$OPTS"
13
14while true; do
15 case "$1" in
16 --vmid) VMID="$2"; shift 2 ;;
17 --template) TEMPLATE_NAME="$2"; shift 2 ;;
18 --storage) STORAGE="$2"; shift 2 ;;
19 --skip-disk) SKIP_DISK_SETUP=true; shift ;;
20 --) shift; break ;;
21 *) break ;;
22 esac
23done
24
25# Récupérer les clés SSH
26SSH_KEYS=$(curl -s https://gist.vorpax.dev/vorpax/ssh/raw/HEAD/ssh-keys.pub | sed 's/%20/ /g; s/%0A/\n/g; s/%3D/=/g; s/%2F/\//g; s/%40/@/g; s/%3A/:/g')
27
28cd /tmp
29
30if [ "$SKIP_DISK_SETUP" = false ]; then
31 echo "Downloading cloud image..."
32 wget -O "${TEMPLATE_NAME}_disk" "$TEMPLATE_URL"
33
34 # Créer la VM avec une config minimale
35 qm create "$VMID" \
36 --name "$TEMPLATE_NAME" \
37 --memory 3072 \
38 --cores 3 \
39 --scsihw virtio-scsi-pci \
40 --serial0 socket \
41 --vga serial0 \
42 --net0 virtio,bridge=vmbr0
43
44 # Importer le disque et capturer le nom du disque créé
45 echo "Importing disk..."
46 IMPORT_OUTPUT=$(qm importdisk "$VMID" "${TEMPLATE_NAME}_disk" "$STORAGE" 2>&1)
47 echo "$IMPORT_OUTPUT"
48
49 # Extraire le nom du disque (format: unused0, unused1, etc.)
50 # qm importdisk affiche quelque chose comme "Successfully imported disk as 'unused0:...'"
51 DISK_REF=$(echo "$IMPORT_OUTPUT" | grep -oP "unused\d+:${STORAGE}:vm-${VMID}-disk-\d+" || echo "${STORAGE}:vm-${VMID}-disk-0")
52
53 # Alternative plus robuste : lister les disques unused
54 UNUSED_DISK=$(qm config "$VMID" | grep "^unused" | head -1 | cut -d: -f1)
55
56 if [ -n "$UNUSED_DISK" ]; then
57 echo "Attaching disk from $UNUSED_DISK..."
58 # Attacher le disque unused au contrôleur SCSI
59 qm set "$VMID" --scsi0 "$UNUSED_DISK"
60 else
61 echo "WARNING: Could not find unused disk, trying manual reference..."
62 qm set "$VMID" --scsi0 "${STORAGE}:vm-${VMID}-disk-0"
63 fi
64
65 rm "${TEMPLATE_NAME}_disk"
66else
67 echo "Skipping disk setup (--skip-disk flag)"
68fi
69
70# Créer le dossier des clés SSH
71SSH_KEYS_DIR="ssh_keys_${VMID}"
72mkdir -p "$SSH_KEYS_DIR"
73
74# Écrire toutes les clés dans un seul fichier
75SSH_KEY_FILE="${SSH_KEYS_DIR}/authorized_keys"
76echo "$SSH_KEYS" > "$SSH_KEY_FILE"
77echo "SSH keys written to $SSH_KEY_FILE"
78
79# Configurer cloud-init et le reste (en une seule commande qm set)
80qm set "$VMID" \
81 --sshkey "$SSH_KEY_FILE" \
82 --ide2 "${STORAGE}:cloudinit" \
83 --boot order=scsi0 \
84 --ciuser packer \
85 --searchdomain .lab.internal \
86 --ipconfig0 ip=dhcp
87
88# Convertir en template
89qm template "$VMID"
90
91echo "Template $VMID ready for Packer"