Go to file
Михаил Ильясов 5eb40abcb0 first add 2025-10-29 20:52:42 +07:00
.terraform/providers/registry.terraform.io/telmate/proxmox first add 2025-10-29 20:52:42 +07:00
.terraform.lock.hcl first add 2025-10-29 20:52:42 +07:00
README.md first add 2025-10-29 20:52:42 +07:00
main.tf first add 2025-10-29 20:52:42 +07:00
terraform.tfstate first add 2025-10-29 20:52:42 +07:00
terraform.tfstate.backup first add 2025-10-29 20:52:42 +07:00

README.md

Terraform + Proxmox Cloud-Init Setup

Описание

Этот проект демонстрирует, как:

  1. Создать Debian/Ubuntu шаблон с поддержкой Cloud-Init в Proxmox.
  2. Подготовить шаблон для клонирования.
  3. Создать виртуальную машину через Terraform с использованием шаблона, с настройкой CPU, диска, сети, IP и SSH-ключей.

Шаг 0: Установка Terraform

Windows

  1. Скачайте Terraform: Terraform Download
  2. Распакуйте архив в удобную папку, например C:\terraform
  3. Добавьте путь в PATH:
    setx PATH "$env:PATH;C:\terraform"
    
  4. Проверьте установку:
    terraform version
    

Шаг 1: Создание Cloud-Init шаблона в Proxmox

1. Скачивание ISO Debian/Ubuntu

  • Скачайте минимальный образ Debian или Ubuntu (например netinst):

  • Загрузите ISO в Proxmox:
    Datacenter → local → ISO Images → Upload


2. Создание новой VM в Proxmox

Пример через CLI:

qm create 9000 --name "debian-template" --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0
qm set 9000 --scsihw virtio-scsi-pci --scsi0 local-lvm:10
qm set 9000 --ide2 local:iso/debian-13.0.0-amd64-netinst.iso,media=cdrom
qm set 9000 --boot c --bootdisk scsi0

Запустите VM и установите минимальную систему Debian/Ubuntu.


3. Установка Cloud-Init и QEMU Guest Agent

После установки:

apt update
apt install -y cloud-init qemu-guest-agent
systemctl enable qemu-guest-agent

4. Настройка serial-консоли для Cloud-Init

Чтобы Cloud-Init корректно работал через Proxmox:

nano /etc/default/grub

Измените:

GRUB_CMDLINE_LINUX_DEFAULT="quiet"

на:

GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8"

Применяем:

update-grub
systemctl enable serial-getty@ttyS0.service

5. Очистка шаблона

cloud-init clean
apt clean
history -c
poweroff

6. Преобразование VM в шаблон

qm template 9000

Теперь шаблон готов для клонирования.


Шаг 2: Настройка Terraform

1. Структура проекта

terraform-proxmox/
├── main.tf
├── variables.tf  # если используете переменные
└── terraform.tfvars

2. Пример main.tf

terraform {
  required_providers {
    proxmox = {
      source  = "Telmate/proxmox"
      version = "3.0.2-rc05"
    }
  }
}

provider "proxmox" {
  pm_tls_insecure = true
  pm_api_url      = "https://192.168.251.251:8006/api2/json"
  pm_user         = "terraform@pve"
  pm_password     = "P@ssw0rd"
}

resource "proxmox_vm_qemu" "vm1" {
  name        = "terraform-vm1"
  description = "Debian VM cloned from Cloud-Init template"
  target_node = "pve0"
  clone       = "debian-template"
 # full_clone  = true
  agent       = 1
  os_type     = "cloud-init"

  # CPU and Memory

  memory = 4096
  scsihw  = "virtio-scsi-pci"
  bootdisk = "scsi0"

  # CPU Block is now REQUIRED[citation:5]
  cpu {
    type = "host"
    cores   = 4            # Количество ядер на сокет
    sockets = 1 

  }

  # Disks must now be defined in nested `disks` blocks[citation:1][citation:3]
  disks {
    scsi {
      scsi0 {
        disk {
          size    = 20
          storage = "ssd1"
        }
      }
    }
    ide {
      ide3 {
        cloudinit {
          storage = "ssd1"
        }
      }
    }
  }

  # Network must be defined in a `network` block with an ID[citation:5]
  network {
    id     = 0 # The network ID is now required and must be in sequence (0, 1, 2...)[citation:5]
    model  = "virtio"
    bridge = "vmbr0"
  }

  # Cloud-Init
  ciuser     = "debian"
  cipassword = "Password123!"
  ipconfig0  = "ip=192.168.251.100/24,gw=192.168.251.254"
serial {
  id   = 0
  type = "socket"
}
 # sshkeys = <<EOF
#ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCu... user@host
#EOF

}

3. Запуск Terraform

terraform init
terraform plan
terraform apply

После выполнения VM создастся с:

  • Настроенным CPU, RAM, диском.
  • Cloud-Init: IP, пароль пользователя, SSH ключи.
  • Активированным QEMU Guest Agent.

Рекомендации

  • Для нескольких VM используйте count или for_each в Terraform.
  • Для динамического IP можно использовать шаблоны и переменные Terraform.
  • Убедитесь, что шаблон Cloud-Init подготовлен, иначе VM может не получить IP и SSH.