Tag: automation

  • Hasil Deploy VM Ubuntu di Proxmox dengan Terraform

    Hasil Deploy VM Ubuntu di Proxmox dengan Terraform

    Pada artikel sebelumnya, saya sudah menyiapkan seluruh kebutuhan Terraform untuk Proxmox, mulai dari Terraform Controller, API Token, konfigurasi network, hingga file Terraform untuk membuat tiga VM Ubuntu.

    Kali ini saya akan mengaplikasikan konfigurasi yang sudah dibuat tersebut dan melihat hasil deployment-nya langsung di homelab.

    Topologi homelab

    Seluruh perangkat berada pada network 192.168.14.0/24.

    HostnameFungsiIP Address
    terraform-controllerMenjalankan Terraform192.168.14.80
    ubuntu-tf-01VM hasil Terraform192.168.14.81
    ubuntu-tf-02VM hasil Terraform192.168.14.82
    ubuntu-tf-03VM hasil Terraform192.168.14.83

    Alurnya kurang lebih seperti berikut:

    Terraform Controller
    192.168.14.80
            │
            │ Proxmox API
            ▼
         Proxmox VE
            │
            ├── ubuntu-tf-01 → 192.168.14.81
            ├── ubuntu-tf-02 → 192.168.14.82
            └── ubuntu-tf-03 → 192.168.14.83
    

    Cara Kerjanya

    Saya menggunakan provider bpg/proxmox sebagai penghubung antara Terraform dengan Proxmox API.

    Secara sederhana, Terraform tidak membuat VM dengan mengklik Web UI. Terraform mengirim request ke API Proxmox menggunakan API Token yang sudah dibuat.

    Konfigurasi Terraform
            │
            ▼
    bpg/proxmox Provider
            │
            │ API Request
            ▼
    Proxmox API :8006
            │
            ▼
    Resource dibuat di Proxmox
    

    API tersebut memungkinkan Terraform untuk mengunduh image, membuat VM, mengatur disk, network, Cloud-init, hingga menyalakan VM.

    Terraform kemudian menjalankan beberapa proses secara otomatis:

    1. Mengunduh Ubuntu 24.04 Cloud Image.
    2. Mengimport image ke storage Proxmox.
    3. Membuat tiga VM.
    4. Membuat disk dari Ubuntu Cloud Image.
    5. Mengatur CPU, RAM, disk, dan network.
    6. Mengatur IP statis melalui Cloud-init.
    7. Memasukkan SSH public key.
    8. Menyalakan seluruh VM.

    Dengan cara ini, saya tidak perlu menulis resource VM sebanyak tiga kali. Terraform melakukan iterasi berdasarkan hostname, VM ID, dan IP yang sudah ditentukan.

    Menjalankan Plan yang Sudah Disimpan

    Pada artikel panduan sebelumnya, konfigurasi sudah diperiksa menggunakan:

    terraform init
    terraform validate

    Kemudian rencana deployment dibuat dan disimpan ke file tfplan:

    terraform plan -out=tfplan

    Hasil plan menunjukkan:

    Plan: 4 to add, 0 to change, 0 to destroy.

    Empat resource tersebut terdiri dari:

    ResourceJumlah
    Ubuntu Cloud Image1
    VM Ubuntu3

    Untuk menjalankan rencana yang sudah disimpan tersebut, saya cukup menjalankan:

    terraform apply tfplan

    Dengan menggunakan saved plan, Terraform menerapkan perubahan yang sebelumnya sudah diperiksa pada saat terraform plan.

    Hasil Deployment

    Setelah proses selesai, Terraform berhasil membuat ketiga VM sesuai konfigurasi.

    181  ubuntu-tf-01  → 192.168.14.81
    182  ubuntu-tf-02  → 192.168.14.82
    183  ubuntu-tf-03  → 192.168.14.83

    Masing-masing VM sudah memiliki CPU, RAM, disk, IP statis, Cloud-init, dan SSH key sesuai konfigurasi Terraform.

    Ketiga VM juga langsung terlihat pada Proxmox dan berada dalam kondisi Running.

    Konfigurasi cloud-init

    Untuk memastikan VM benar-benar dapat digunakan, saya mencoba mengakses salah satunya dari Terraform Controller:

    ssh ubuntu@192.168.14.81

    Artinya VM tidak hanya berhasil dibuat di Proxmox, tetapi juga sudah mendapatkan konfigurasi awal dan dapat diakses melalui SSH.

    Terraform State

    VM yang dibuat tidak hanya dibuat sekali oleh Terraform, tetapi selanjutnya juga dikelola oleh Terraform.

    Resource tersebut dapat dilihat menggunakan:

    terraform state list

    Contohnya:

    proxmox_download_file.ubuntu_cloud_image
    proxmox_virtual_environment_vm.ubuntu_vm["ubuntu-tf-01"]
    proxmox_virtual_environment_vm.ubuntu_vm["ubuntu-tf-02"]
    proxmox_virtual_environment_vm.ubuntu_vm["ubuntu-tf-03"]

    State digunakan Terraform untuk mencatat resource yang dikelolanya. Karena itu, konfigurasi yang sama nantinya dapat digunakan untuk menambah, mengubah, atau menghapus VM.

    Kesimpulan

    Percobaan ini berhasil membuat 3 VM Ubuntu di Proxmox secara otomatis menggunakan Terraform.

    Rancang dan konfigurasi
          ↓
    terraform plan -out=tfplan
          ↓
    terraform apply tfplan
          ↓
    3 VM Ubuntu Running

    Jika sebelumnya pembuatan VM dilakukan satu per satu melalui Web UI, sekarang konfigurasi infrastrukturnya sudah tersimpan sebagai kode dan dapat digunakan kembali.

    Percobaan ini juga menjadi dasar sebelum melanjutkan otomatisasi berikutnya menggunakan Ansible untuk melakukan konfigurasi sistem setelah VM selesai dibuat.

    Referensi

  • Mengintegrasikan Proxmox dengan Terraform untuk Deploy Virtual Machine

    Mengintegrasikan Proxmox dengan Terraform untuk Deploy Virtual Machine

    Pada artikel sebelumnya saya membahas gambaran otomatisasi homelab Proxmox menggunakan Terraform dan Ansible.

    Kali ini saya mulai mempraktikkannya di homelab, dimulai dari Terraform terlebih dahulu. Targetnya adalah menyiapkan Terraform Controller yang nantinya dapat membuat 3 VM Ubuntu secara otomatis di Proxmox.

    Pada bagian ini proses hanya sampai terraform plan, sehingga belum ada perubahan yang diterapkan ke Proxmox.

    Rancangan Homelab

    Seluruh server menggunakan network 192.168.14.0/24.

    HostnameFungsiIP Address
    terraform-controllerTerraform Controller192.168.14.80
    ubuntu-tf-01VM Target192.168.14.81
    ubuntu-tf-02VM Target192.168.14.82
    ubuntu-tf-03VM Target192.168.14.83

    Konfigurasi Proxmox:

    ParameterNilai
    Nodepverafi1
    APIhttps://192.168.14.31:8006/
    Gateway192.168.14.31
    Bridgevmbr0
    Image Storagelocal
    VM Storagelocal-lvm

    Alur yang akan dibuat:

    Terraform Controller
    192.168.14.80
            │
            │ Proxmox API
            ▼
         Proxmox VE
            │
            ├── ubuntu-tf-01 → 192.168.14.81
            ├── ubuntu-tf-02 → 192.168.14.82
            └── ubuntu-tf-03 → 192.168.14.83
    

    1. Menyiapkan Terraform Controller

    Saya membuat satu VM Ubuntu Server 24.04 secara manual di Proxmox dengan spesifikasi:

    ResourceKonfigurasi
    CPU2 Core
    RAM2 GB
    Disk20 GB
    Networkvmbr0
    IP192.168.14.80/24

    VM ini hanya digunakan sebagai controller untuk menjalankan Terraform.

    Setelah Ubuntu selesai diinstal, pastikan controller dapat berkomunikasi dengan Proxmox:

    ping -c 3 192.168.14.31
    

    2. Install Terraform

    Install dependency:

    sudo apt update
    sudo apt install -y gnupg software-properties-common wget curl

    Tambahkan GPG key HashiCorp:

    wget -O- https://apt.releases.hashicorp.com/gpg |
    gpg --dearmor |
    sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg > /dev/null

    Tambahkan repository:

    echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(grep -oP '(?<=UBUNTU_CODENAME=).*' /etc/os-release || lsb_release -cs) main" |
    sudo tee /etc/apt/sources.list.d/hashicorp.list

    Kemudian install Terraform:

    sudo apt update
    sudo apt install -y terraform

    Verifikasi instalasi:

    root@terraform:~/terraform-proxmox# terraform version
    Terraform v1.15.8
    on linux_amd64

    3. Mengaktifkan Import Storage Proxmox

    Terraform nantinya akan mengunduh Ubuntu Cloud Image dan memasukkannya ke storage Proxmox.

    Buka:

    Datacenter
    └── Storage
        └── local
            └── Edit

    Pada bagian Content, aktifkan:

    Import

    Ini dibutuhkan agar Terraform dapat menggunakan Ubuntu Cloud Image sebagai sumber disk VM.

    4. Membuat User Terraform

    Sebaiknya Terraform menggunakan user khusus, bukan akun administrator utama Proxmox.

    Buka:

    Datacenter
    └── Permissions
        └── Users
            └── Add

    Buat:

    terraform@pve

    Untuk percobaan homelab ini saya memberikan role:

    Administrator

    pada path:

    /

    Untuk lingkungan production, permission sebaiknya dibatasi sesuai kebutuhan.

    Membuat API Token

    Buka:

    Datacenter
    └── Permissions
        └── API Tokens
            └── Add

    Gunakan:

    ParameterNilai
    Userterraform@pve
    Token IDprovider
    Privilege SeparationNonaktif

    Setelah dibuat, simpan:

    Token secret hanya ditampilkan satu kali.

    5. Test Proxmox API

    Dari Terraform Controller:

    curl -k https://192.168.14.31:8006/api2/json/version

    Kemudian masukkan API token sebagai environment variable:

    read -rsp "API token: " PROXMOX_VE_API_TOKEN
    export PROXMOX_VE_API_TOKEN
    echo ${#PROXMOX_VE_API_TOKEN}  -> output harus > 0

    Formatnya:

    terraform@pve!provider=TOKEN_SECRET

    Test autentikasi:

    curl -k -H \ "Authorization:PVEAPIToken=${PROXMOX_VE_API_TOKEN}" \
    https://192.168.14.31:8006/api2/json/version

    Jika berhasil, Proxmox akan mengembalikan informasi versi dalam format JSON.

    6. Membuat SSH Key

    SSH key nantinya akan dimasukkan ke setiap VM melalui Cloud-init.

    ssh-keygen -t ed25519 -C "terraform-controller"

    Gunakan lokasi default:

    ~/.ssh/id_ed25519

    7. Membuat Project Terraform

    Buat directory:

    mkdir -p ~/terraform-proxmox
    cd ~/terraform-proxmox

    Struktur project:

    terraform-proxmox/
    ├── versions.tf
    ├── variables.tf
    ├── main.tf
    ├── terraform.tfvars
    └── outputs.tf
    

    8. Konfigurasi Provider

    Buat versions.tf:

    terraform {
      required_version = ">= 1.5.0"
    
      required_providers {
        proxmox = {
          source  = "bpg/proxmox"
          version = "~> 0.111.0"
        }
      }
    }
    
    provider "proxmox" {
      endpoint = var.proxmox_endpoint
      insecure = true
    }

    Saya menggunakan provider bpg/proxmox.

    insecure = true digunakan karena Proxmox homelab masih menggunakan sertifikat self-signed.

    9. Membuat Variable

    Buat variables.tf:

    variable "proxmox_endpoint" {
      type = string
    }
    
    variable "proxmox_node" {
      type = string
    }
    
    variable "image_datastore" {
      type    = string
      default = "local"
    }
    
    variable "vm_datastore" {
      type    = string
      default = "local-lvm"
    }
    
    variable "bridge" {
      type    = string
      default = "vmbr0"
    }
    
    variable "gateway" {
      type = string
    }
    
    variable "dns_servers" {
      type    = list(string)
      default = ["8.8.8.8", "1.1.1.1"]
    }
    
    variable "ssh_public_key_file" {
      type    = string
      default = "~/.ssh/id_ed25519.pub"
    }

    10. Mendefinisikan 3 VM Ubuntu

    Konfigurasi utama berada pada main.tf.

    Pertama, tentukan VM yang ingin dibuat:

    locals {
      ubuntu_vms = {
        "ubuntu-tf-01" = {
          vm_id = 181
          ip    = "192.168.14.81/24"
        }
    
        "ubuntu-tf-02" = {
          vm_id = 182
          ip    = "192.168.14.82/24"
        }
    
        "ubuntu-tf-03" = {
          vm_id = 183
          ip    = "192.168.14.83/24"
        }
      }
    }

    Kemudian definisikan Ubuntu Cloud Image:

    resource "proxmox_download_file" "ubuntu_cloud_image" {
      content_type = "import"
      datastore_id = var.image_datastore
      node_name    = var.proxmox_node
    
      url       = "https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img"
      file_name = "noble-server-cloudimg-amd64.qcow2"
    
      overwrite = false
    }

    Selanjutnya resource VM:

    resource "proxmox_virtual_environment_vm" "ubuntu_vm" {
      for_each = local.ubuntu_vms
    
      name        = each.key
      description = "Ubuntu 24.04 deployed by Terraform"
      tags        = ["terraform", "ubuntu"]
    
      node_name = var.proxmox_node
      vm_id     = each.value.vm_id
    
      started = true
      on_boot = true
    
      boot_order    = ["scsi0"]
      scsi_hardware = "virtio-scsi-single"
    
      cpu {
        cores = 2
        type  = "x86-64-v2-AES"
      }
    
      memory {
        dedicated = 2048
      }
    
      disk {
        datastore_id = var.vm_datastore
        import_from  = proxmox_download_file.ubuntu_cloud_image.id
        interface    = "scsi0"
        size         = 20
        discard      = "on"
        iothread     = true
      }
    
      initialization {
        datastore_id = var.vm_datastore
    
        dns {
          servers = var.dns_servers
        }
    
        ip_config {
          ipv4 {
            address = each.value.ip
            gateway = var.gateway
          }
        }
    
        user_account {
          username = "ubuntu"
    
          keys = [
            trimspace(
              file(
                pathexpand(var.ssh_public_key_file)
              )
            )
          ]
        }
      }
    
      network_device {
        bridge = var.bridge
        model  = "virtio"
      }
    
      operating_system {
        type = "l26"
      }
    
      serial_device {}
    }

    Dengan looping for_each, satu resource dapat digunakan untuk mendefinisikan tiga VM sekaligus.

    Target konfigurasinya:

    VMVM IDIPCPURAMDisk
    ubuntu-tf-01181192.168.14.812 Core2 GB20 GB
    ubuntu-tf-02182192.168.14.822 Core2 GB20 GB
    ubuntu-tf-03183192.168.14.832 Core2 GB20 GB

    11. Konfigurasi Environment Homelab

    Buat terraform.tfvars:

    proxmox_endpoint = "https://192.168.14.31:8006/"
    proxmox_node     = "pverafi1"
    
    image_datastore = "local"
    vm_datastore    = "local-lvm"
    
    bridge  = "vmbr0"
    gateway = "192.168.14.31"
    
    dns_servers = [
      "8.8.8.8",
      "1.1.1.1"
    ]
    
    ssh_public_key_file = "~/.ssh/id_ed25519.pub"

    Nama node dapat diperiksa pada Proxmox:

    hostname

    Sedangkan storage:

    pvesm status

    12. Membuat Output

    Buat outputs.tf:

    output "deployed_vms" {
      value = {
        for name, vm in local.ubuntu_vms : name => {
          vm_id = vm.vm_id
          ip     = split("/", vm.ip)[0]
          ssh    = "ssh ubuntu@${split("/", vm.ip)[0]}"
        }
      }
    }

    Output ini nantinya menampilkan informasi VM setelah deployment dilakukan.

    13. Inisialisasi dan Validasi Terraform

    Rapikan konfigurasi:

    terraform fmt

    Download dan inisialisasi provider:

    terraform init

    Kemudian lakukan validasi:

    terraform validate

    Jika konfigurasi benar:

    Success! The configuration is valid.

    Sampai tahap ini Terraform sudah siap berkomunikasi dengan Proxmox dan konfigurasi VM sudah berhasil divalidasi.

    14. Melihat Terraform Plan

    Sebelum benar-benar membuat VM, periksa terlebih dahulu perubahan yang akan dilakukan Terraform.

    Pastikan API token masih tersedia:

    echo "${PROXMOX_VE_API_TOKEN:+API token sudah tersedia}"

    Kemudian:

    terraform plan

    Targetnya Terraform menampilkan:

    Plan: 4 to add, 0 to change, 0 to destroy.

    Empat resource tersebut adalah:

    ResourceJumlah
    Ubuntu Cloud Image1
    Ubuntu VM3
    Total4

    Plan juga dapat disimpan:

    terraform plan -out=tfplan

    File tfplan inilah yang nantinya dapat diterapkan menggunakan terraform apply.

    Referensi

    • HashiCorp Terraform Documentation
    • bpg/proxmox Terraform Provider
    • Proxmox VE Documentation
    • Ubuntu Cloud Images