Skip to main content

Tạo VM với Terraform và Proxmox

Step 1: Tạo API Token và Lưu lại Token ID , Secret

  • Login vào proxmox ve server 
  • Chọn Datacenter ở cột trái
  • Nhìn qua phải thì section Permissions > chọn API Token
  • Chọn Add để tạo Api Token
image.png
  • Add Token theo user root
  • Privilege Seperation: Unchecked (bỏ check)
  • Token Id: Điền tên terraform
  • Nhấn Add Button

image.png

Lưu lại các thông tin sau vì nó chỉ hiện một lần:

  • Token ID: root@pam!teraform
  • Secret: 8ac5928a-9f2f-49e0-90d4-7542f87b9361

image.png

Step 2: Tạo Folder và các files terraform-proxmox

Sau khi lưu xong token id và secret thì bạn mở webstorm hay vscode lên, tạo project trống tên là terraform-proxmox ở ổ đĩa nào tùy bạn, mình chọn ổ đĩa F:

  • Install plugin hổ trợ terraform language

image.png

Tạo 3 file, provider.tf, credentials.auto.tfvars, srv-demo-1.tf

file: provider.tf

terraform {

  required_version = ">= 0.13.0"

  required_providers {
    proxmox = {
      source  = "telmate/proxmox"
      version = ">= 2.9.14"
    }
  }
}

variable "proxmox_api_url" {
  type = string
}

variable "proxmox_api_token_id" {
  type      = string
  sensitive = true
}

variable "proxmox_api_token_secret" {
  type      = string
  sensitive = true
}

provider "proxmox" {
  pm_api_url = var.proxmox_api_url
  pm_token_id = var.proxmox_api_token_id
  pm_token_secret = var.proxmox_api_token_secret
  pm_tls_insecure = true
}

file: credentials.auto.tfvars

proxmox_api_url = "https://gray.kyluat.lan:8006/api2/json"
proxmox_api_token_id = "root@pam!teraform2"
proxmox_api_token_secret = "8ac5928a-9f2f-49e0-90d4-7542f87b9361"

Nhớ chỉnh sửa lại thông tin url, token id và token secret của bạn đã tạo. cái url thay thế bằng ip address server proxmox của bạn cũng đc. ví dụ: https://192.168.1.12:8006/api2/json

file: srv-demo-1.tf

resource "proxmox_vm_qemu" "srv_demo_1" {
  name        = "srv-demo-1"
  desc        = "Demo Server 1"
  vmid        = "201"
  target_node = "gray"
  agent       = 0

  clone   = "ubuntu-cloud"
  cores   = 2
  sockets = 1
  cpu     = "host"
  memory  = 2048

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

  disk {
    type = "virtio"
    storage = "local-lvm"
    size    = "2252M"
  }

  os_type = "cloud-init"
  ipconfig0 = "ip=dhcp"
  nameserver = "192.168.1.11"
  ciuser = "USERNAMEABC"
  sshkeys = <<EOF
    ssh-rsa AAAAB3NzaC1yc2EAAABKDJhkashdkahsdahdkhasd.35c2EAAABKDJhkashdkahsdahdkhasd.35c2EAAABKDJhkashdkahsdahdkhasd.35c2EAAABKDJhkashdkahsdahdkhasd.3590Y
  EOF
}

Nhớ chỉnh sửa thông tin cho phù hợp:

  • agent: nếu mà cloud image của bạn đã cài đặt qemu guest agent sẵn rồi thì để value 1. còn không thì để 0
  • clone: là tên của cloud image mà bạn đã tạo, không cần vmid 
  • storage: bình thường là local-lvm , còn bạn xài storage khác thì sửa lại
  • ipconfig0: bạn có thể để static ip cũng đc, còn không để dhcp cho server tự tạo ip
  • nameserver: dns nameserver ip của mình dùng là pi-hole
  • ciuser: username của cloud image của bạn đã setup
  • sshkeys: chỉnh sửa lại ssh keys để sau khi khởi tạo còn login vào dễ dàng.
  • disk > type: bình thường là virtio, nếu xài scsi thì phải sửa lại type = "scsi". điền thêm thông tin bên ngoài (trên dòng os_type) với:
  disk {
    type = "scsi"
    storage = "local-lvm"
    size    = "2252M"
  }

  scsihw = "virtio-scsi-pci"

  os_type = "cloud-init"
  • disks > size: phần này phải điền đúng với size của cloud image đã tạo. nếu không terraform tự tạo ra 2nd disk.

Cài đặt terraform lên máy và cd tới folder project đó, sau đó đánh command 

cd f:/terraform-proxmox/
terraform init

image.png

sau đó đánh command sau để check xem terraform plan success hết variables hay không:

terraform plan

image.png

Nếu thấy mọi thứ xanh lè hết thì đúng rồi, trừ phi copy and paste mấy cái thông số sai. Kế tiếp nhấn command sau để apply:

terraform apply --auto-approve

image.png

Sau đó vào proxmox sẽ thấy vm srv_demo_1 như hình sau

Kết quả:

image.png

image.png


image.png