Utoljára aktív 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.

vorpax gist felülvizsgálása 3 weeks ago. Revízióhoz ugrás

1 file changed, 89 insertions, 16 deletions

create-pve-template.sh

@@ -2,10 +2,11 @@
2 2 set -e
3 3
4 4 TEMPLATE_URL="https://cloud-images.ubuntu.com/plucky/current/plucky-server-cloudimg-amd64.img"
5 - VMID=9000
5 + VMID=9001
6 6 TEMPLATE_NAME="ubuntu-25.04-cloudimg-temp"
7 7 STORAGE="local-lvm"
8 8 SKIP_DISK_SETUP=false
9 + VMID_CUSTOM=false # Track if VMID was explicitly set
9 10
10 11 # Parser avec getopt
11 12 OPTS=$(getopt -o "" --long vmid:,template:,storage:,skip-disk -n 'script' -- "$@")
@@ -13,7 +14,7 @@ eval set -- "$OPTS"
13 14
14 15 while true; do
15 16 case "$1" in
16 - --vmid) VMID="$2"; shift 2 ;;
17 + --vmid) VMID="$2"; VMID_CUSTOM=true; shift 2 ;;
17 18 --template) TEMPLATE_NAME="$2"; shift 2 ;;
18 19 --storage) STORAGE="$2"; shift 2 ;;
19 20 --skip-disk) SKIP_DISK_SETUP=true; shift ;;
@@ -22,6 +23,69 @@ while true; do
22 23 esac
23 24 done
24 25
26 + # Detect if we need sudo (non-root user)
27 + if [ "$(id -u)" -ne 0 ]; then
28 + echo "Running as non-root user, will use sudo for qm commands"
29 + SUDO="sudo"
30 + else
31 + SUDO=""
32 + fi
33 +
34 + # Check if VMID already exists
35 + ORIGINAL_VMID=$VMID
36 + echo "Checking if VMID $VMID is available..."
37 + if $SUDO qm status "$VMID" &>/dev/null; then
38 + # VMID exists, check if it's already a template
39 + IS_TEMPLATE=$($SUDO qm config "$VMID" | grep -q "^template:" && echo "yes" || echo "no")
40 +
41 + if [ "$IS_TEMPLATE" = "yes" ]; then
42 + echo "✓ VMID $VMID already exists and is a template (idempotent)"
43 + echo ""
44 + echo "========================================="
45 + echo "Template already exists!"
46 + echo " VMID: $VMID"
47 + echo "========================================="
48 + echo ""
49 + echo "Skipping template creation (already exists)."
50 + exit 0
51 + else
52 + echo "⚠ VMID $VMID already exists but is NOT a template!"
53 +
54 + # If VMID is the default (9001) and was not explicitly set, error out
55 + # This ensures Packer can find the expected template
56 + if [ "$VMID_CUSTOM" = "false" ]; then
57 + echo ""
58 + echo "========================================="
59 + echo "ERROR: Default VMID $VMID is occupied!"
60 + echo "========================================="
61 + echo ""
62 + echo "VMID $VMID exists but is not a template."
63 + echo ""
64 + echo "Solutions:"
65 + echo " 1. Delete the VM: qm destroy $VMID"
66 + echo " 2. Convert it to template: qm template $VMID"
67 + echo " 3. Use a different VMID: $0 --vmid XXXX"
68 + echo ""
69 + exit 1
70 + fi
71 +
72 + # If VMID was explicitly set, auto-increment to next available
73 + echo "Finding next available VMID..."
74 + MAX_VMID=$($SUDO qm list | awk 'NR>1 {print $1}' | sort -n | tail -1)
75 +
76 + if [ -z "$MAX_VMID" ]; then
77 + # No VMs exist, use the requested VMID
78 + echo "No existing VMs found, using VMID $VMID"
79 + else
80 + # Use max VMID + 1
81 + VMID=$((MAX_VMID + 1))
82 + echo "✓ Using next available VMID: $VMID (max existing: $MAX_VMID)"
83 + fi
84 + fi
85 + else
86 + echo "✓ VMID $VMID is available"
87 + fi
88 +
25 89 # Récupérer les clés SSH
26 90 SSH_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 91
@@ -32,7 +96,7 @@ if [ "$SKIP_DISK_SETUP" = false ]; then
32 96 wget -O "${TEMPLATE_NAME}_disk" "$TEMPLATE_URL"
33 97
34 98 # Créer la VM avec une config minimale
35 - qm create "$VMID" \
99 + $SUDO qm create "$VMID" \
36 100 --name "$TEMPLATE_NAME" \
37 101 --memory 3072 \
38 102 --cores 3 \
@@ -40,23 +104,24 @@ if [ "$SKIP_DISK_SETUP" = false ]; then
40 104 --serial0 socket \
41 105 --vga serial0 \
42 106 --net0 virtio,bridge=vmbr0
43 -
107 +
44 108 # Importer le disque
45 109 echo "Importing disk..."
46 - qm importdisk "$VMID" "${TEMPLATE_NAME}_disk" "$STORAGE"
47 -
110 + $SUDO qm importdisk "$VMID" "${TEMPLATE_NAME}_disk" "$STORAGE"
111 +
48 112 # Extraire le chemin complet du disque unused (la partie APRÈS "unused0: ")
49 - DISK_PATH=$(qm config "$VMID" | grep "^unused0:" | awk '{print $2}')
50 -
113 + DISK_PATH=$($SUDO qm config "$VMID" | grep "^unused0:" | awk '{print $2}')
114 +
51 115 if [ -z "$DISK_PATH" ]; then
52 116 echo "ERROR: Could not find unused disk"
53 117 exit 1
54 118 fi
55 -
119 +
56 120 echo "Attaching disk: $DISK_PATH"
57 - qm set "$VMID" --scsi0 "$DISK_PATH"
58 -
59 - rm "${DISK_PATH}"
121 + $SUDO qm set "$VMID" --scsi0 "$DISK_PATH"
122 +
123 + # Cleanup temporary downloaded file
124 + rm -f "${TEMPLATE_NAME}_disk"
60 125 else
61 126 echo "Skipping disk setup (--skip-disk flag)"
62 127 fi
@@ -71,15 +136,23 @@ echo "$SSH_KEYS" > "$SSH_KEY_FILE"
71 136 echo "SSH keys written to $SSH_KEY_FILE"
72 137
73 138 # Configurer cloud-init et le reste
74 - qm set "$VMID" \
139 + $SUDO qm set "$VMID" \
75 140 --sshkey "$SSH_KEY_FILE" \
76 141 --ide2 "${STORAGE}:cloudinit" \
77 - --boot order=scsi0 \
142 + --boot order=scsi0 \
78 143 --ciuser packer \
79 144 --searchdomain .lab.internal \
80 145 --ipconfig0 ip=dhcp
146 + --bios ovmf
81 147
82 148 # Convertir en template
83 - qm template "$VMID"
149 + $SUDO qm template "$VMID"
84 150
85 - echo "Template $VMID ready for Packer"
151 + echo ""
152 + echo "========================================="
153 + echo "✓ Template created successfully!"
154 + echo " VMID: $VMID"
155 + echo " Name: $TEMPLATE_NAME"
156 + echo "========================================="
157 + echo ""
158 + echo "Template is ready for Packer to clone and provision."

vorpax gist felülvizsgálása 1 month ago. Revízióhoz ugrás

Nincsenek változtatások

vorpax gist felülvizsgálása 1 month ago. Revízióhoz ugrás

Nincsenek változtatások

vorpax gist felülvizsgálása 1 month ago. Revízióhoz ugrás

1 file changed, 12 insertions, 18 deletions

create-pve-template.sh

@@ -41,28 +41,22 @@ if [ "$SKIP_DISK_SETUP" = false ]; then
41 41 --vga serial0 \
42 42 --net0 virtio,bridge=vmbr0
43 43
44 - # Importer le disque et capturer le nom du disque créé
44 + # Importer le disque
45 45 echo "Importing disk..."
46 - IMPORT_OUTPUT=$(qm importdisk "$VMID" "${TEMPLATE_NAME}_disk" "$STORAGE" 2>&1)
47 - echo "$IMPORT_OUTPUT"
46 + qm importdisk "$VMID" "${TEMPLATE_NAME}_disk" "$STORAGE"
48 47
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")
48 + # Extraire le chemin complet du disque unused (la partie APRÈS "unused0: ")
49 + DISK_PATH=$(qm config "$VMID" | grep "^unused0:" | awk '{print $2}')
52 50
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"
51 + if [ -z "$DISK_PATH" ]; then
52 + echo "ERROR: Could not find unused disk"
53 + exit 1
63 54 fi
64 55
65 - rm "${TEMPLATE_NAME}_disk"
56 + echo "Attaching disk: $DISK_PATH"
57 + qm set "$VMID" --scsi0 "$DISK_PATH"
58 +
59 + rm "${DISK_PATH}"
66 60 else
67 61 echo "Skipping disk setup (--skip-disk flag)"
68 62 fi
@@ -76,7 +70,7 @@ SSH_KEY_FILE="${SSH_KEYS_DIR}/authorized_keys"
76 70 echo "$SSH_KEYS" > "$SSH_KEY_FILE"
77 71 echo "SSH keys written to $SSH_KEY_FILE"
78 72
79 - # Configurer cloud-init et le reste (en une seule commande qm set)
73 + # Configurer cloud-init et le reste
80 74 qm set "$VMID" \
81 75 --sshkey "$SSH_KEY_FILE" \
82 76 --ide2 "${STORAGE}:cloudinit" \

vorpax gist felülvizsgálása 1 month ago. Revízióhoz ugrás

1 file changed, 38 insertions, 22 deletions

create-pve-template.sh

@@ -22,24 +22,47 @@ while true; do
22 22 esac
23 23 done
24 24
25 - # Récupérer les clés SSH avec décodage propre
25 + # Récupérer les clés SSH
26 26 SSH_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 27
28 28 cd /tmp
29 29
30 30 if [ "$SKIP_DISK_SETUP" = false ]; then
31 - echo "Downloading and importing disk..."
31 + echo "Downloading cloud image..."
32 32 wget -O "${TEMPLATE_NAME}_disk" "$TEMPLATE_URL"
33 33
34 + # Créer la VM avec une config minimale
34 35 qm create "$VMID" \
35 36 --name "$TEMPLATE_NAME" \
36 37 --memory 3072 \
37 38 --cores 3 \
38 - --net0 virtio,bridge=vmbr0 \
39 + --scsihw virtio-scsi-pci \
39 40 --serial0 socket \
40 - --vga serial0
41 + --vga serial0 \
42 + --net0 virtio,bridge=vmbr0
41 43
42 - qm importdisk "$VMID" "${TEMPLATE_NAME}_disk" "$STORAGE"
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"
43 66 else
44 67 echo "Skipping disk setup (--skip-disk flag)"
45 68 fi
@@ -48,28 +71,21 @@ fi
48 71 SSH_KEYS_DIR="ssh_keys_${VMID}"
49 72 mkdir -p "$SSH_KEYS_DIR"
50 73
51 - # Écrire chaque clé dans un fichier unique
52 - KEY_INDEX=0
53 - while IFS= read -r key; do
54 - [ -z "$key" ] && continue
55 - SSH_KEY_FILE="${SSH_KEYS_DIR}/key_$(date +%s)_${KEY_INDEX}.pub"
56 - echo "$key" > "$SSH_KEY_FILE"
57 - echo "${key} in ${SSH_KEY_FILE}"
58 - qm set "$VMID" --sshkey "$SSH_KEY_FILE"
59 - ((KEY_INDEX++))
60 - done <<< "$SSH_KEYS"
74 + # Écrire toutes les clés dans un seul fichier
75 + SSH_KEY_FILE="${SSH_KEYS_DIR}/authorized_keys"
76 + echo "$SSH_KEYS" > "$SSH_KEY_FILE"
77 + echo "SSH keys written to $SSH_KEY_FILE"
61 78
79 + # Configurer cloud-init et le reste (en une seule commande qm set)
62 80 qm set "$VMID" \
63 - --scsihw virtio-scsi-pci \
64 - --scsi0 "${STORAGE}:vm-${VMID}-disk-0" \
81 + --sshkey "$SSH_KEY_FILE" \
65 82 --ide2 "${STORAGE}:cloudinit" \
66 - --boot c --bootdisk scsi0 \
67 - --serial0 socket \
68 - --vga serial0 \
69 - --net0 virtio,bridge=vmbr0 \
83 + --boot order=scsi0 \
70 84 --ciuser packer \
71 - --searchdomain .lab.internal
85 + --searchdomain .lab.internal \
86 + --ipconfig0 ip=dhcp
72 87
88 + # Convertir en template
73 89 qm template "$VMID"
74 90
75 91 echo "Template $VMID ready for Packer"

vorpax gist felülvizsgálása 1 month ago. Revízióhoz ugrás

1 file changed, 1 insertion, 1 deletion

create-pve-template.sh

@@ -68,7 +68,7 @@ qm set "$VMID" \
68 68 --vga serial0 \
69 69 --net0 virtio,bridge=vmbr0 \
70 70 --ciuser packer \
71 - --searchdomain example.com
71 + --searchdomain .lab.internal
72 72
73 73 qm template "$VMID"
74 74

vorpax gist felülvizsgálása 1 month ago. Revízióhoz ugrás

1 file changed, 1 insertion

create-pve-template.sh

@@ -54,6 +54,7 @@ while IFS= read -r key; do
54 54 [ -z "$key" ] && continue
55 55 SSH_KEY_FILE="${SSH_KEYS_DIR}/key_$(date +%s)_${KEY_INDEX}.pub"
56 56 echo "$key" > "$SSH_KEY_FILE"
57 + echo "${key} in ${SSH_KEY_FILE}"
57 58 qm set "$VMID" --sshkey "$SSH_KEY_FILE"
58 59 ((KEY_INDEX++))
59 60 done <<< "$SSH_KEYS"

vorpax gist felülvizsgálása 1 month ago. Revízióhoz ugrás

1 file changed, 10 insertions, 11 deletions

create-pve-template.sh

@@ -7,19 +7,18 @@ TEMPLATE_NAME="ubuntu-25.04-cloudimg-temp"
7 7 STORAGE="local-lvm"
8 8 SKIP_DISK_SETUP=false
9 9
10 - # positional args first (optional)
11 - [ -n "$1" ] && VMID="$1"
12 - [ -n "$2" ] && TEMPLATE_NAME="$2"
13 - [ -n "$3" ] && STORAGE="$3"
10 + # Parser avec getopt
11 + OPTS=$(getopt -o "" --long vmid:,template:,storage:,skip-disk -n 'script' -- "$@")
12 + eval set -- "$OPTS"
14 13
15 - # overrides (still optional)
16 - while [[ $# -gt 3 ]]; do
17 - shift
14 + while true; do
18 15 case "$1" in
19 - --vmid=*) VMID="${1#*=}" ;;
20 - --template=*) TEMPLATE_NAME="${1#*=}" ;;
21 - --storage=*) STORAGE="${1#*=}" ;;
22 - --skip-disk) SKIP_DISK_SETUP=true ;;
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 ;;
23 22 esac
24 23 done
25 24

vorpax gist felülvizsgálása 1 month ago. Revízióhoz ugrás

1 file changed, 21 insertions, 11 deletions

create-pve-template.sh

@@ -5,7 +5,7 @@ TEMPLATE_URL="https://cloud-images.ubuntu.com/plucky/current/plucky-server-cloud
5 5 VMID=9000
6 6 TEMPLATE_NAME="ubuntu-25.04-cloudimg-temp"
7 7 STORAGE="local-lvm"
8 - SSH_KEYS=$(curl -s https://gist.vorpax.dev/vorpax/ssh/raw/HEAD/ssh-keys.pub)
8 + SKIP_DISK_SETUP=false
9 9
10 10 # positional args first (optional)
11 11 [ -n "$1" ] && VMID="$1"
@@ -19,21 +19,31 @@ while [[ $# -gt 3 ]]; do
19 19 --vmid=*) VMID="${1#*=}" ;;
20 20 --template=*) TEMPLATE_NAME="${1#*=}" ;;
21 21 --storage=*) STORAGE="${1#*=}" ;;
22 + --skip-disk) SKIP_DISK_SETUP=true ;;
22 23 esac
23 24 done
24 25
25 - cd /tmp
26 - wget -O "${TEMPLATE_NAME}_disk" "$TEMPLATE_URL"
26 + # Récupérer les clés SSH avec décodage propre
27 + SSH_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 28
28 - qm create "$VMID" \
29 - --name "$TEMPLATE_NAME" \
30 - --memory 3072 \
31 - --cores 3 \
32 - --net0 virtio,bridge=vmbr0 \
33 - --serial0 socket \
34 - --vga serial0
29 + cd /tmp
35 30
36 - qm importdisk "$VMID" "${TEMPLATE_NAME}_disk" "$STORAGE"
31 + if [ "$SKIP_DISK_SETUP" = false ]; then
32 + echo "Downloading and importing disk..."
33 + wget -O "${TEMPLATE_NAME}_disk" "$TEMPLATE_URL"
34 +
35 + qm create "$VMID" \
36 + --name "$TEMPLATE_NAME" \
37 + --memory 3072 \
38 + --cores 3 \
39 + --net0 virtio,bridge=vmbr0 \
40 + --serial0 socket \
41 + --vga serial0
42 +
43 + qm importdisk "$VMID" "${TEMPLATE_NAME}_disk" "$STORAGE"
44 + else
45 + echo "Skipping disk setup (--skip-disk flag)"
46 + fi
37 47
38 48 # Créer le dossier des clés SSH
39 49 SSH_KEYS_DIR="ssh_keys_${VMID}"

vorpax gist felülvizsgálása 1 month ago. Revízióhoz ugrás

1 file changed, 14 insertions, 10 deletions

create-pve-template.sh

@@ -23,8 +23,7 @@ while [[ $# -gt 3 ]]; do
23 23 done
24 24
25 25 cd /tmp
26 - wget -O "${TEMPLATE_NAME}_disk" \
27 - "$TEMPLATE_URL"
26 + wget -O "${TEMPLATE_NAME}_disk" "$TEMPLATE_URL"
28 27
29 28 qm create "$VMID" \
30 29 --name "$TEMPLATE_NAME" \
@@ -36,13 +35,18 @@ qm create "$VMID" \
36 35
37 36 qm importdisk "$VMID" "${TEMPLATE_NAME}_disk" "$STORAGE"
38 37
39 - mkdir -p ssh_keys_tmp
38 + # Créer le dossier des clés SSH
39 + SSH_KEYS_DIR="ssh_keys_${VMID}"
40 + mkdir -p "$SSH_KEYS_DIR"
40 41
41 -
42 - SSH_KEYS_ARGS=""
42 + # Écrire chaque clé dans un fichier unique
43 + KEY_INDEX=0
43 44 while IFS= read -r key; do
44 - [ -z "$key" ] && continue
45 - SSH_KEYS_ARGS+=" --sshkey $key"
45 + [ -z "$key" ] && continue
46 + SSH_KEY_FILE="${SSH_KEYS_DIR}/key_$(date +%s)_${KEY_INDEX}.pub"
47 + echo "$key" > "$SSH_KEY_FILE"
48 + qm set "$VMID" --sshkey "$SSH_KEY_FILE"
49 + ((KEY_INDEX++))
46 50 done <<< "$SSH_KEYS"
47 51
48 52 qm set "$VMID" \
@@ -50,11 +54,11 @@ qm set "$VMID" \
50 54 --scsi0 "${STORAGE}:vm-${VMID}-disk-0" \
51 55 --ide2 "${STORAGE}:cloudinit" \
52 56 --boot c --bootdisk scsi0 \
53 - --serial0 socket --vga serial0 \
57 + --serial0 socket \
58 + --vga serial0 \
54 59 --net0 virtio,bridge=vmbr0 \
55 60 --ciuser packer \
56 - --searchdomain example.com \
57 - $SSH_KEYS_ARGS
61 + --searchdomain example.com
58 62
59 63 qm template "$VMID"
60 64
Újabb Régebbi