Skip to content

Instantly share code, notes, and snippets.

@eduardomazolini
Last active July 8, 2026 15:53
Show Gist options
  • Select an option

  • Save eduardomazolini/a83b111a93904f209202e41060d51638 to your computer and use it in GitHub Desktop.

Select an option

Save eduardomazolini/a83b111a93904f209202e41060d51638 to your computer and use it in GitHub Desktop.
Cria um VM usando debian13, console serial, cloud-init no disco lvm. Edite para sua necessidade.
#!/bin/bash
#
# criar-template-vm.sh
#
# Cria um template Proxmox a partir de uma imagem cloud (qcow2) e clona
# uma VM a partir dele, configurando cloud-init.
#
# Uso:
# ./criar-template-vm.sh
#
# Ajuste as variáveis abaixo antes de rodar.
set -euo pipefail
# ----------------------------- Configuração -----------------------------
TEMPLATEID=9000
VMID=9001
IMAGE="${IMAGE:-debian-13-genericcloud-amd64-custom.qcow2}"
STORAGE="local-lvm"
TEMPLATENAME="debian13-custom"
VMNAME="minha-vm-debian"
CIUSER="emazolini"
SENHA="Mude a senha que esta aqui"
SSHKEY="sshkeys.pub"
VMDNS="8.8.8.8,1.1.1.1"
# --------------------------------------------------------------------------
log() { echo ">> $*"; }
# --- Validações prévias ---
[ -f "$IMAGE" ] || { echo "Erro: imagem '$IMAGE' não encontrada."; exit 1; }
[ -f "$SSHKEY" ] || { echo "Erro: chave pública '$SSHKEY' não encontrada."; exit 1; }
if qm status "$TEMPLATEID" &>/dev/null; then
echo "Erro: já existe um VM/template com ID $TEMPLATEID."
exit 1
fi
if qm status "$VMID" &>/dev/null; then
echo "Erro: já existe uma VM com ID $VMID."
exit 1
fi
# --- 1. Criar VM base (hardware, sem discos ainda) ---
log "Criando VM base $TEMPLATEID..."
qm create "$TEMPLATEID" \
--name "$TEMPLATENAME" \
--memory 2024 \
--cores 1 \
--cpu host \
--machine q35,viommu=intel \
--agent enabled=1,fstrim_cloned_disks=1 \
--scsihw virtio-scsi-pci \
--bios ovmf \
--ostype l26 \
--balloon 1024 \
--serial0 socket \
--vga serial0 \
--net0 virtio,bridge=vmbr0
# --- 2. Importar disco (precisa vir ANTES do efidisk para virar disk-0) ---
log "Importando imagem $IMAGE..."
qm importdisk "$TEMPLATEID" "$IMAGE" "$STORAGE"
qm set "$TEMPLATEID" --virtio0 "$STORAGE:vm-$TEMPLATEID-disk-0,discard=on,iothread=1"
# --- 3. Criar disco EFI (agora vira disk-1) ---
qm set "$TEMPLATEID" --efidisk0 "$STORAGE:0,efitype=4m,pre-enrolled-keys=1,format=raw"
# --- 4. Drive de cloud-init ---
qm set "$TEMPLATEID" --ide2 "$STORAGE:cloudinit"
# --- 5. Ordem de boot: disco primeiro, evitando fallback para net0 ---
qm set "$TEMPLATEID" --boot order=virtio0
# --- 6. Converter em template ---
log "Convertendo $TEMPLATEID em template..."
qm template "$TEMPLATEID"
# --- 7. Clonar VM a partir do template ---
log "Clonando VM $VMID a partir do template..."
qm clone "$TEMPLATEID" "$VMID" --name "$VMNAME"
# --- 8. Configurar cloud-init da VM clonada ---
qm set "$VMID" --ciuser "$CIUSER"
qm set "$VMID" --cipassword "$SENHA"
qm set "$VMID" --sshkeys "$SSHKEY"
qm set "$VMID" --ipconfig0 ip=dhcp
qm set "$VMID" --nameserver "$VMDNS"
# --- 9. Iniciar ---
log "Iniciando VM $VMID..."
qm start "$VMID"
# --- 10. Verificação ---
log "Configuração final da VM $VMID:"
qm config "$VMID"
log "Storage:"
pvesm list "$STORAGE" | grep "vm-$VMID" || echo "(nenhum disco listado ainda, aguarde alguns segundos)"
cat <<EOF
VM $VMID ("$VMNAME") criada e iniciada com sucesso.
Acesso:
Console serial : Proxmox Web UI > VM > Console
SSH : ssh $CIUSER@<ip-da-vm>
EOF
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment