--- layout: page page_title: "Configure a VM with Cloud-Init" subcategory: Guides description: |- This guide explains how to use the Proxmox provider to create and manage virtual machines using cloud-init. --- # Configure a VM with Cloud-Init ## Native Proxmox Cloud-Init support Proxmox supports Cloud-Init natively, so you can use the `initialization` block to configure your VM: ```terraform data "local_file" "ssh_public_key" { filename = "./id_rsa.pub" } resource "proxmox_virtual_environment_vm" "ubuntu_vm" { name = "test-ubuntu" node_name = "pve" initialization { ip_config { ipv4 { address = "192.168.3.233/24" gateway = "192.168.3.1" } } user_account { username = "ubuntu" keys = [trimspace(data.local_file.ssh_public_key.content)] } } disk { datastore_id = "local-lvm" file_id = proxmox_virtual_environment_download_file.ubuntu_cloud_image.id interface = "virtio0" iothread = true discard = "on" size = 20 } network_device { bridge = "vmbr0" } } resource "proxmox_virtual_environment_download_file" "ubuntu_cloud_image" { content_type = "iso" datastore_id = "local" node_name = "pve" url = "https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img" } ``` Note that many cloud images do not have `qemu-guest-agent` installed by default, so you won't be able to retrieve the dynamic IP address of the VM from Proxmox, as this is agent's responsibility. You can use the `ip_config` block to configure a static IP address instead. ## Custom Cloud-Init configuration Because of several limitations of the native Proxmox cloud-init support, you may want to use a custom Cloud-Init configuration instead. This would allow you to adjust the VM configuration to your needs, and also install the `qemu-guest-agent` and additional packages. In order to use a custom cloud-init configuration, you need to create a `cloud-config` snippet file and pass it to the VM as a `user_data_file_id` parameter. You can use the `proxmox_virtual_environment_file` resource to create the file. Make sure the "Snippets" content type is enabled on the target datastore in Proxmox before applying the configuration below. ```terraform data "local_file" "ssh_public_key" { filename = "./id_rsa.pub" } resource "proxmox_virtual_environment_file" "cloud_config" { content_type = "snippets" datastore_id = "local" node_name = "pve" source_raw { data = <<-EOF #cloud-config users: - default - name: ubuntu groups: - sudo shell: /bin/bash ssh_authorized_keys: - ${trimspace(data.local_file.ssh_public_key.content)} sudo: ALL=(ALL) NOPASSWD:ALL runcmd: - apt update - apt install -y qemu-guest-agent net-tools - timedatectl set-timezone America/Toronto - systemctl enable qemu-guest-agent - systemctl start qemu-guest-agent - echo "done" > /tmp/cloud-config.done EOF file_name = "cloud-config.yaml" } } ``` ```terraform resource "proxmox_virtual_environment_vm" "ubuntu_vm" { name = "test-ubuntu" node_name = "pve" agent { enabled = true } cpu { cores = 2 } memory { dedicated = 2048 } disk { datastore_id = "local-lvm" file_id = proxmox_virtual_environment_download_file.ubuntu_cloud_image.id interface = "virtio0" iothread = true discard = "on" size = 20 } initialization { ip_config { ipv4 { address = "dhcp" } } user_data_file_id = proxmox_virtual_environment_file.cloud_config.id } network_device { bridge = "vmbr0" } } resource "proxmox_virtual_environment_download_file" "ubuntu_cloud_image" { content_type = "iso" datastore_id = "local" node_name = "pve" url = "https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img" } output "vm_ipv4_address" { value = proxmox_virtual_environment_vm.ubuntu_vm.ipv4_addresses[1][0] } ```