|
|
||
|---|---|---|
| .terraform/providers/registry.terraform.io/telmate/proxmox | ||
| .terraform.lock.hcl | ||
| README.md | ||
| main.tf | ||
| terraform.tfstate | ||
| terraform.tfstate.backup | ||
README.md
Terraform + Proxmox Cloud-Init Setup
Описание
Этот проект демонстрирует, как:
- Создать Debian/Ubuntu шаблон с поддержкой Cloud-Init в Proxmox.
- Подготовить шаблон для клонирования.
- Создать виртуальную машину через Terraform с использованием шаблона, с настройкой CPU, диска, сети, IP и SSH-ключей.
Шаг 0: Установка Terraform
Windows
- Скачайте Terraform: Terraform Download
- Распакуйте архив в удобную папку, например
C:\terraform - Добавьте путь в
PATH:setx PATH "$env:PATH;C:\terraform" - Проверьте установку:
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.