Last active
July 8, 2026 15:53
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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