Cara Deploy VM di Proxmox Menggunakan Terraform

Introduction

Pada artikel sebelumnya saya membahas tentang AWS CLI dan juga cara deploy instance di AWS menggunakan Terraform, nah pada kesempatan kali ini saya akan mencoba menggunakannya di on premise/proxmox. Untuk pengertian mengapa kita menggunakan terraform di artikel saya yang sebelumnya sudah saya jelaskan silahkan check link dibawah ini :

Prepare

Hal-hal yang perlu disiapkan pada setup ini adalah :

  • Install Terraform
  • Komunikasi terraform ke proxmox menggunakan API Tokens (Create User/Pass atau secret) terlebih dahulu.
  • Create Template proxmox dengan mode “Cloud init” untuk OS nya https://pve.proxmox.com/wiki/Cloud-Init_Support
  • Terraform basic installation & provide installation
  • Develop Variable Terraform to Proxmox
  • Develop Terraform Plan
  • Run Terraform Plan & Check

Proxmox yang support API Tokens adalah versi 7 keatas, dan pastikan hal2 diatas sudah anda penuhi atau siapkan sebelum melakukan lab.

Study case

Saya membutuhkan 2 VM untuk digunakan sebagai VM clustering yang akan saya implementasikan di on-premise, tentnu jika saya tidak menggunakan terraform maka hal tersebut akan sedikit agak lama jika saya melakukan installasi manual via GUI, nah pada kesempatan kali ini , kemarin saya sudah menemukan cara menggunakan tools yang bernama terraform maka dari itu saya mau mencoba nya di proxmox, dengan task sebagai berikut :

Create VM/node on Proxmox with Terraform “Infrastructure as a code”

  • Create variable: with SSH Keys, Proxmox Host, Template-name -> ISO
  • 2 VM
  • CPU 2Core, Ram 2Gb, Hdd 10G
  • network Vbmr1
  • ipconfig : ip dimulai 172.26.0.91 & 92

check it out

Step 1 – Create File Terraform

Buatlah 2 file pada folder terraform kalian dengan nama variable dan main

Terraform – proxmox
  • main tf : berisi file konfigurasi yang akan kita gunakan nantinya contoh seperti, kita akan define CPU, RAM, storage, IP dan juga instance atau node dll
  • variable.tf : berisi file untuk men define SSH keys laptop kita, host proxmox dan juga templane-name ISO yang akan ktia gunakan

variable.tf

variable "ssh_key" {
  default = "ssh_KEY_laptop_kita"
}
variable "proxmox_host" {
    default = "host_proxmox"
}
variable "template_name" {
    default = "nama_template_OS"
}

main.tf

Step 2 – Add provider & Define user Access

Disini kita menggunakan versi provider proxmox yang tersedia atau support oleh terraform adalah v 2.7.4.

terraform {
    required_version = ">=1.0.0"
    required_providers {
        proxmox = {
            source = "telmate/proxmox"
            version = "2.7.4"
        }
    }
}
provider "proxmox" {
    pm_api_url = "https://proxmox_host:8006/api2/json"
    pm_api_token_id = "user@pam!tf_token_id"
    pm_api_token_secret = "secret_key"
    pm_tls_insecure = "true"
}

Define proxmox access dengan memasukan URLtoken id, dan secret, disini koneksi antara terraform dan proxmox menggunakan API Tokens, dan registry tersebut sudah terdaftar di Terraform Registry.

Step 3 – Define Spec for Create VM/node

Sama halnya ketika kita membuat instance di AWS, disini sayapun juga membuat instance atau VM dengan mendefine spesifikasi yang saya butuhkan.

resource "proxmox_vm_qemu" "terraform-test" {
    count = 2 //jumlah VM
    name = "terraform-vm-${count.index + 1}" //Create VM dengan no berurutan 1,2 dan seterusnya
    target_node = "te1"
    clone = "ubuntu-2004-cloudinit-template"

    agent = 1
    os_type = "cloud-init"
    cores = 2
    sockets = 1
    cpu = "host"
    memory = 2048
    scsihw = "virtio-scsi-pci"
    bootdisk = "scsi0"

proxmox_vm_qemu Resourve VM yang kita gunakan dari terraform registry

terraform-test nama atau deskripsi instance kita

count 2 Vm yang kita buat

target_node adalah node atau nama hostname proxmox kita

clone kita clone template yang sudah dibuat

Kemudian kita tinggal mendefine, berapa core & socket, memory dan juga jenis hardisk dan juga bootdisk.

Step 4 – Define Storage & Interface network for VM

Kita bisa input size, type hardisk yang sesuai di environment kita, kemudian pilihan untuk interfaces network yang digunakan.

   disk {
        slot = 0
        size = "10G"
        type = "scsi"
        storage = "local"
        iothread = 1
    }

    network {
        model = "virtio"
        bridge = "vmbr1"
    }

    lifecycle {
        ignore_changes = [
          network,
        ]
      }

Step 5 – Define IP & Add env Variable SSH

Kemudian selanjutnya kita bisa mengalokasikan IP yang akan digunakan oleh si VM itu nantinya.

ipconfig0 = "ip=172.26.0.9${count.index + 1}/24,gw=172.26.0.1"

      sshkeys = <<EOF
      ${var.ssh_key}
      EOF
    
}

ipconfig0 alokasi ip dengan metode $ string dan akan otomatis bertambah jika vm yang dibuat lebih dari satu dan juga sudah di define subnet & gatewaynya.

sshkeys untuk men sync ke variable ssh yang sudah kita masukan tadi karena koneksinya menggunakan metode ssh keypair : https://igunawan.com/login-ssh-server-tanpa-password/

Code lengkap dari main.tf

terraform {
    required_version = ">=1.0.0"
    required_providers {
        proxmox = {
            source = "telmate/proxmox"
            version = "2.7.4"
        }
    }
}
provider "proxmox" {
    pm_api_url = "https://proxmox_host:8006/api2/json"
    pm_api_token_id = "user@pam!tf_token_id"
    pm_api_token_secret = "secret_key"
    pm_tls_insecure = "true"
}

resource "proxmox_vm_qemu" "terraform-test" {
    count = 2 //jumlah VM
    name = "terraform-vm-${count.index + 1}" //Create VM
    target_node = "te1"
    clone = "ubuntu-2004-cloudinit-template"

    agent = 1
    os_type = "cloud-init"
    cores = 2
    sockets = 1
    cpu = "host"
    memory = 2048
    scsihw = "virtio-scsi-pci"
    bootdisk = "scsi0"

    disk {
        slot = 0
        size = "10G"
        type = "scsi"
        storage = "local"
        iothread = 1
    }

    network {
        model = "virtio"
        bridge = "vmbr1"
    }

    lifecycle {
        ignore_changes = [
          network,
        ]
      }
      ipconfig0 = "ip=172.26.0.9${count.index + 1}/24,gw=172.26.0.1"

      sshkeys = <<EOF
      ${var.ssh_key}
      EOF
    
}

Step 6 – Provisioning Instance

terraform init diperlukan untuk inisialisasi awal pada directory file terraform kita

terragorm init

terraform plan untuk mengetahui resource apa saja yang kita akan buat

terraform plan

terraform apply ntuk melakukan provisioning membuat resource pada cloud provider kita dalam hal ini proxmox

Step 7 – Check console & Access SSH

Kita lakukan pengecekan pada console proxmox kita bahwasanya vm kita sudah tercreate atau terbuat dengan menggunakan terraform tersebut.

VM terraform node

Dan yang terakhir kita testing akses remote via SSH

SSH vm 1
SSH vm 2

Selamat mencoba

Leave a Reply

Your email address will not be published. Required fields are marked *