CODECAVE
Tempo di lettura: 2 min

Come automatizzare il deployment delle VM Proxmox con Pulumi

Fai il deployment di VM Proxmox in pochi minuti con Pulumi e Python

L'automazione dell'infrastruttura è l'elemento chiave per un deployment degli ambienti rapido, efficiente, prevedibile e riproducibile. La maggior parte delle guide su Proxmox e Pulumi in circolazione è desolantemente superficiale: sfoggia buzzword ma ti lascia a metà strada, senza esempi reali né passaggi spiegati uno per uno. Sappiamo che ti serve più della teoria: ti serve una guida che scenda in profondità, mostri i dettagli scomodi e ti dia codice funzionante da usare subito.

Nel nostro articolo precedente su Proxmox abbiamo mostrato come i template di VM Proxmox, uniti a Cloud-Init, accelerino enormemente il workflow di deployment. Quella base è solida, ma c'è un approccio ancora più potente ad aspettarti.

Per ottenere una vera automazione "con un solo comando" ed eliminare il configuration drift manuale, ti serve uno strumento che ti permetta di definire l'infrastruttura come scrivi il codice applicativo. A differenza degli strumenti tradizionali basati su linguaggi proprietari, Pulumi ti consente di definire l'infrastruttura con i linguaggi di programmazione che già conosci: Python, Go, C#, Java e TypeScript. Puoi così sfruttare le competenze che hai già, applicare le best practice dell'ingegneria del software e integrarti senza attriti con le pipeline CI/CD. In questa guida pratica ti mostriamo esattamente come usare Pulumi con Proxmox: dall'installazione a un esempio Python funzionante che puoi adattare subito. Un percorso concreto che ti darà le conoscenze e la sicurezza per cambiare il modo in cui gestisci l'infrastruttura. Pronto a salire di livello? Cominciamo.

Che cos'è Pulumi?

Pulumi è uno strumento open-source per la gestione dell'infrastruttura cloud. Tra le sue caratteristiche principali:

  • usa linguaggi di programmazione universali al posto di un DSL (a differenza di Terraform);
  • funziona con le principali piattaforme cloud usate dalle aziende: AWS, Azure, Google Cloud;
  • gestione dello stato flessibile: lo stato dell'infrastruttura può restare in locale per lo sviluppo, su S3 per il lavoro in team o in Pulumi Cloud per le funzionalità enterprise;
  • piene capacità di programmazione (logica, cicli, condizioni).

Per Proxmox, il provider pulumi-proxmoxve consente di gestire:

  • macchine virtuali (VM);
  • template;
  • dischi;
  • interfacce di rete;
  • parametri Cloud-init.

Passo 1: installare Pulumi

Pulumi si installa su tutti i sistemi operativi più diffusi:

Installazione su macOS

brew install pulumi/tap/pulumi

Installazione su Windows

Puoi installarlo dal sito ufficiale Pulumi

Installazione su Linux

curl -fsSL https://get.pulumi.com | sh

Dopo l'installazione, Pulumi viene aggiunto a ~/.pulumi/bin.

Se per qualche motivo la variabile PATH non fosse stata aggiornata:

export PATH=$PATH:$HOME/.pulumi/bin
echo 'export PATH=$PATH:$HOME/.pulumi/bin' >> ~/.bashrc
source ~/.bashrc

Verifica dell'installazione

pulumi version

Se il comando mostra il numero di versione di Pulumi, l'installazione è completata.

Passo 2: configurare Pulumi per l'integrazione con Proxmox

Per gestire Proxmox, Pulumi ha bisogno dell'accesso via API.

2.1 Abilitare l'accesso API in Proxmox

  1. Apri la Web UI di Proxmox
  2. Raggiungi gli API Token: Datacenter → Permissions → API Tokens
  3. Crea un token, per esempio root@pam
  4. Imposta "Privilege Separation" su false (per l'accesso completo). Clicca "Add"
  5. Copia:
    • Token ID
    • Secret
  6. Assegna i permessi: Datacenter → Permissions → Add → Api token:
    • Path → /
    • Api token → Token name
    • Role → Administrator

Passo 3: creare un progetto Pulumi

mkdir pulumi-proxmox
cd pulumi-proxmox
pulumi new python

Dopo l'inizializzazione avrai:

Pulumi.yaml
__main__.py
requirements.txt

Configurare il provider:

pip install pulumi-proxmoxve

Pulumi mette a disposizione una propria configurazione integrata, ed è quella che useremo

pulumi config set proxmox:endpoint https://192.168.0.128:8016/
pulumi config set proxmox:api-name root@pam!pulumi
pulumi config set proxmox:public-key: "ssh-key"
pulumi config set proxmox:api-token "api token" --plaintext

Passo 4. Esempio di codice: creare una VM da un template

Ora la parte più interessante: creiamo una VM dal template preparato in precedenza.

Importare il provider

# python
import pulumi
from pulumi_proxmoxve import Provider
from pulumi_proxmoxve.vm import VirtualMachine

Caricare la configurazione di Pulumi

# python
config = pulumi.Config("proxmox")
endpoint = config.require("endpoint")
public_key = config.require("public-key")
api_token = config.require_secret("api-token")
api_name = config.require("api-name")

Connettersi all'API di Proxmox

# python
provider = proxmoxve.Provider(
    "proxmoxve",
    endpoint=endpoint,
    api_token=f"{api_name}={api_token}",
    insecure=True
)

Creare la VM dal template

vm = proxmoxve.vm.VirtualMachine(
       resource_name="vm-test",
       node_name="srv0",        
       vm_id=9875,               
       name="pulumi-vm-test",
       agent=proxmoxve.vm.VirtualMachineAgentArgs(
           enabled=False,
           trim=True,
           type="virtio"
       ),
       bios="seabios",
       memory=proxmoxve.vm.VirtualMachineMemoryArgs(
           dedicated=4096
       ),
       cpu=proxmoxve.vm.VirtualMachineCpuArgs(
           cores=2,
           sockets=1
       ),
       clone=proxmoxve.vm.VirtualMachineCloneArgs(
           node_name="srv0",
           vm_id=9000,
           full=True
       ),
       disks=[
           proxmoxve.vm.VirtualMachineDiskArgs(
               interface="scsi0",
               datastore_id="local-lvm",
               size=20,              
               file_format="qcow2"
           )
       ],
       cdrom=proxmoxve.vm.VirtualMachineCdromArgs(
           interface="ide2",
           file_id="none"
       ),
       network_devices=[
           proxmoxve.vm.VirtualMachineNetworkDeviceArgs(
               bridge="vmbr0",
               model="virtio"
           )
       ],
       on_boot=True,
       operating_system=proxmoxve.vm.VirtualMachineOperatingSystemArgs(type="other"),
       initialization=proxmoxve.vm.VirtualMachineInitializationArgs(
           type="nocloud",
           datastore_id="local-lvm",
           dns=proxmoxve.vm.VirtualMachineInitializationDnsArgs(
               domain="example.com",
               servers=["1.1.1.1", "8.8.8.8"]
           ),
           ip_configs=[
               proxmoxve.vm.VirtualMachineInitializationIpConfigArgs(
                   ipv4=proxmoxve.vm.VirtualMachineInitializationIpConfigIpv4Args(
                       address="192.168.0.140/24",
                       gateway="192.168.0.1"
                   )
               )
           ],
           user_account=proxmoxve.vm.VirtualMachineInitializationUserAccountArgs(
               username="user",
               password="password123",
               keys=[public_key]
           )
       ),
       opts=pulumi.ResourceOptions(provider=prov

Passo 5. Esecuzione

Anteprima del piano:

pulumi preview

Applicare:

pulumi up

Pulumi mostrerà quale VM verrà creata e chiederà conferma. Dopo la conferma, la VM comparirà in Proxmox.

Passo 6. Eliminare la VM

Se la VM non serve più:

pulumi destroy

Che cosa abbiamo ottenuto?

  • Processo di creazione delle VM completamente automatizzato
  • Uso dei template + Cloud-Init
  • Gestione tramite codice Python
  • Possibilità di creare decine di VM con un solo comando

L'approccio scala senza difficoltà: puoi generare VM in un ciclo, creare pool di risorse, collegarle automaticamente alle reti e integrare il tutto nella CI/CD.

Per approfondire ti consigliamo di consultare la documentazione ufficiale di Proxmox e di seguire gli aggiornamenti dei nostri articoli. Offriamo servizi su Azure, Proxmox, template di VM sicuri e hardening della CI/CD.