Terraform представляет из себя инструмент описания создания виртуальных машин с помощью IaC (Infrastructure as Code). С помощью данного инструмента мы можем создавать машины в автоматическом режиме, используя только код, и подготовленный темлейт системы в гипервизоре.
terraform init
- инициализация окружения
terraform plan
- планирование внесения изменений
terraform apply
- внесение изменений
Инструмент не доступен в РФ, по этой причине скачиваем его через зеркало Яндекса:
https://hashicorp-releases.yandexcloud.net/terraform
Скачанный файл terraform
(распакованный) перемещаем в директорию mv terraform /bin/
Инструкция Яндекса:
https://yandex.cloud/ru/docs/tutorials/infrastructure-management/terraform-quickstart
Пример файла credentials.auto.tfvars
:
proxmox_api_url = "https://10.10.10.10:8006/api2/json"
proxmox_api_token_id = "root@pam!terraform"
proxmox_api_token_secret = "YOUR-SECRET-HERE"
Пример файла provider.tf
:
terraform {
required_version = ">= 0.13"
required_providers {
yandex = {
source = "yandex-cloud/yandex"
}
proxmox = {
source = "telmate/proxmox"
version = "3.0.1-rc1"
}
}
}
provider "yandex" {
zone = "ru-central1-a"
}
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_api_token_id = var.proxmox_api_token_id
pm_api_token_secret = var.proxmox_api_token_secret
pm_tls_insecure = true
}
Пример файла main.tf
при использовании обычного темплейта (НЕ cloud init):
resource "proxmox_vm_qemu" "main" {
count = 2
name = "prod-server-${count.index + 1}"
desc = "Clone of machine DEBIAN-DOCKER for production"
vmid = "40${count.index + 1}"
target_node = "hosting"
agent = 1
clone = "DEBIAN-DOCKER"
cores = 1
sockets = 2
cpu = "host"
memory = 2048
network {
bridge = "vmbr0"
model = "virtio"
}
disks {
scsi {
scsi0 {
disk {
storage = "local-lvm"
size = "30"
}
}
}
}
}
Пример файла main.tf
при использовании cloud init образа:
resource "proxmox_vm_qemu" "main" {
count = 1
name = "cloud-server-${count.index + 1}"
desc = "Clone of machine DEBIAN-CLOUD for production"
vmid = "50${count.index + 1}"
target_node = "hosting"
agent = 1
clone = "DEBIAN-CLOUD"
cores = 1
sockets = 1
cpu = "host"
memory = 1024
os_type = "cloud-init"
network {
bridge = "vmbr0"
model = "virtio"
}
cloudinit_cdrom_storage = "local-lvm"
scsihw = "virtio-scsi-pci"
boot = "order=scsi0;ide2;net0"
disks {
scsi {
scsi0 {
disk {
storage = "local-lvm"
size = "10"
}
}
}
}
ipconfig0 = "ip=10.10.10.${30 + count.index}/24,gw=10.10.10.1"
nameserver = "10.10.10.1"
ciuser = "root"
sshkeys = <<EOF
PUT-YOU-PUBLIC-KEY-HERE
EOF
}
Пример файла credentials.auto.tfvars
:
vsphere_user = "user@domain.com
vsphere_password = "PASSWORD
vsphere_server = "vsphere.domain.com
Пример файла provider.tf
:
terraform {
required_version = ">= 0.13"
required_providers {
yandex = {
source = "yandex-cloud/yandex"
}
vsphere = {
source = "vsphere"
version = "2.10.0"
}
}
}
provider "yandex" {
zone = "ru-central1-a"
}
variable "vsphere_user" {
type = string
sensitive = true
}
variable "vsphere_password" {
type = string
sensitive = true
}
variable "vsphere_server" {
type = string
}
provider "vsphere" {
user = var.vsphere_user
password = var.vsphere_password
vsphere_server = var.vsphere_server
allow_unverified_ssl = "true"
}
Пример файла main.tf
(копирование):
data "vsphere_datacenter" "datacenter" {
name = "Datacenter"
}
data "vsphere_datastore" "datastore" {
name = "DATASTORE_NAME"
datacenter_id = data.vsphere_datacenter.datacenter.id
}
#data "vsphere_compute_cluster" "cluster" {
# name = "IP_OF_CLUSTER"
# datacenter_id = data.vsphere_datacenter.datacenter.id
#}
data "vsphere_host" "host" {
name = "IP_OF_HOST"
datacenter_id = data.vsphere_datacenter.datacenter.id
}
data "vsphere_network" "network" {
name = "VM Network"
datacenter_id = data.vsphere_datacenter.datacenter.id
}
data "vsphere_virtual_machine" "template" {
name = "debian_12.7_template"
datacenter_id = data.vsphere_datacenter.datacenter.id
}
resource "vsphere_virtual_machine" "vm" {
name = "VM-TEST"
resource_pool_id = data.vsphere_host.host.resource_pool_id
datastore_id = data.vsphere_datastore.datastore.id
num_cpus = 1
memory = 1024
guest_id = "otherLinux64Guest"
network_interface {
network_id = data.vsphere_network.network.id
adapter_type = data.vsphere_virtual_machine.template.network_interface_types[0]
}
disk {
label = "disk0"
size = 20
}
clone {
template_uuid = data.vsphere_virtual_machine.template.id
customize {
linux_options {
host_name = "VM-TEST"
domain = ""
}
network_interface {
}
}
}
}