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
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
terraform plan
untuk mengetahui resource apa saja yang kita akan buat
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.
Dan yang terakhir kita testing akses remote via SSH
Selamat mencoba
Admin website igunawan.com, System Administrator, DevOps Engineer