83 lines
3.1 KiB
Bash
83 lines
3.1 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
# Create a Proxmox template from the cloud image in local:iso/
|
||
|
|
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
echo "═══════════════════════════════════════════════════════════════════════════════"
|
||
|
|
echo " CREATE TEMPLATE FROM CLOUD IMAGE"
|
||
|
|
echo "═══════════════════════════════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
SOURCE_IMAGE="/var/lib/vz/template/iso/ubuntu-22.04-cloud.img"
|
||
|
|
TEMPLATE_VMID=9000
|
||
|
|
TEMPLATE_NAME="ubuntu-22.04-cloud-template"
|
||
|
|
TARGET_STORAGE="local-lvm"
|
||
|
|
|
||
|
|
# Check if source exists
|
||
|
|
echo "Step 1: Checking if source image exists..."
|
||
|
|
if [ ! -f "$SOURCE_IMAGE" ]; then
|
||
|
|
echo "❌ Source image not found: $SOURCE_IMAGE"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
IMAGE_SIZE=$(du -h "$SOURCE_IMAGE" | cut -f1)
|
||
|
|
echo "✅ Source image found: $SOURCE_IMAGE ($IMAGE_SIZE)"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Check if template already exists
|
||
|
|
echo "Step 2: Checking if template already exists..."
|
||
|
|
if qm list | grep -q "^${TEMPLATE_VMID}"; then
|
||
|
|
echo "⚠️ Template VM $TEMPLATE_VMID already exists"
|
||
|
|
read -p "Delete and recreate? (y/N) " -n 1 -r
|
||
|
|
echo
|
||
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||
|
|
qm destroy "$TEMPLATE_VMID" 2>/dev/null || true
|
||
|
|
echo "✅ Old template removed"
|
||
|
|
else
|
||
|
|
echo "Using existing template"
|
||
|
|
exit 0
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Create template VM
|
||
|
|
echo "Step 3: Creating template VM..."
|
||
|
|
qm create "$TEMPLATE_VMID" \
|
||
|
|
--name "$TEMPLATE_NAME" \
|
||
|
|
--memory 512 \
|
||
|
|
--net0 virtio,bridge=vmbr0 \
|
||
|
|
--agent enabled=1 \
|
||
|
|
--template 1 2>/dev/null || true
|
||
|
|
|
||
|
|
# Import the cloud image
|
||
|
|
echo "Step 4: Importing cloud image to template..."
|
||
|
|
echo " This will convert qcow2 to raw format for local-lvm..."
|
||
|
|
if qm disk import "$TEMPLATE_VMID" "$SOURCE_IMAGE" "$TARGET_STORAGE" --format raw 2>&1; then
|
||
|
|
echo "✅ Image imported successfully"
|
||
|
|
else
|
||
|
|
echo "❌ Import failed"
|
||
|
|
qm destroy "$TEMPLATE_VMID" 2>/dev/null || true
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Convert to template
|
||
|
|
echo ""
|
||
|
|
echo "Step 5: Converting VM to template..."
|
||
|
|
qm template "$TEMPLATE_VMID" 2>&1 || {
|
||
|
|
echo "⚠️ Template conversion failed, but VM is ready"
|
||
|
|
}
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
echo "═══════════════════════════════════════════════════════════════════════════════"
|
||
|
|
echo " VERIFICATION"
|
||
|
|
echo "═══════════════════════════════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
echo "Template VM status:"
|
||
|
|
qm list | grep "^${TEMPLATE_VMID}" || echo "Template not found"
|
||
|
|
echo ""
|
||
|
|
echo "✅ Template created! VMs can now clone from VMID $TEMPLATE_VMID"
|
||
|
|
echo ""
|
||
|
|
echo "📝 Note: Update VM image spec to use VMID: $TEMPLATE_VMID"
|
||
|
|
echo " Example: image: \"$TEMPLATE_VMID\""
|
||
|
|
|