237 lines
5.2 KiB
Markdown
237 lines
5.2 KiB
Markdown
# Terraform + Proxmox Cloud-Init Setup
|
||
|
||
## Описание
|
||
|
||
Этот проект демонстрирует, как:
|
||
|
||
1. Создать **Debian/Ubuntu шаблон** с поддержкой Cloud-Init в Proxmox.
|
||
2. Подготовить шаблон для клонирования.
|
||
3. Создать виртуальную машину через **Terraform** с использованием шаблона, с настройкой CPU, диска, сети, IP и SSH-ключей.
|
||
|
||
---
|
||
## Шаг 0: Установка Terraform
|
||
|
||
### Windows
|
||
|
||
1. Скачайте Terraform: [Terraform Download](https://developer.hashicorp.com/terraform/downloads)
|
||
2. Распакуйте архив в удобную папку, например `C:\terraform`
|
||
3. Добавьте путь в `PATH`:
|
||
```powershell
|
||
setx PATH "$env:PATH;C:\terraform"
|
||
```
|
||
4. Проверьте установку:
|
||
```powershell
|
||
terraform version
|
||
```
|
||
|
||
## Шаг 1: Создание Cloud-Init шаблона в Proxmox
|
||
|
||
### 1. Скачивание ISO Debian/Ubuntu
|
||
|
||
- Скачайте минимальный образ Debian или Ubuntu (например netinst):
|
||
- [Debian netinst](https://www.debian.org/distrib/netinst)
|
||
- [Ubuntu Server](https://ubuntu.com/download/server)
|
||
|
||
- Загрузите ISO в Proxmox:
|
||
**Datacenter → local → ISO Images → Upload**
|
||
|
||
---
|
||
|
||
### 2. Создание новой VM в Proxmox
|
||
|
||
Пример через CLI:
|
||
|
||
```bash
|
||
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
|
||
|
||
После установки:
|
||
|
||
```bash
|
||
apt update
|
||
apt install -y cloud-init qemu-guest-agent
|
||
systemctl enable qemu-guest-agent
|
||
```
|
||
|
||
---
|
||
|
||
### 4. Настройка serial-консоли для Cloud-Init
|
||
|
||
Чтобы Cloud-Init корректно работал через Proxmox:
|
||
|
||
```bash
|
||
nano /etc/default/grub
|
||
```
|
||
|
||
Измените:
|
||
|
||
```
|
||
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
|
||
```
|
||
|
||
на:
|
||
|
||
```
|
||
GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8"
|
||
```
|
||
|
||
Применяем:
|
||
|
||
```bash
|
||
update-grub
|
||
systemctl enable serial-getty@ttyS0.service
|
||
```
|
||
|
||
---
|
||
|
||
### 5. Очистка шаблона
|
||
|
||
```bash
|
||
cloud-init clean
|
||
apt clean
|
||
history -c
|
||
poweroff
|
||
```
|
||
|
||
---
|
||
|
||
### 6. Преобразование VM в шаблон
|
||
|
||
```bash
|
||
qm template 9000
|
||
```
|
||
|
||
Теперь шаблон готов для клонирования.
|
||
|
||
---
|
||
|
||
## Шаг 2: Настройка Terraform
|
||
|
||
### 1. Структура проекта
|
||
|
||
```
|
||
terraform-proxmox/
|
||
├── main.tf
|
||
├── variables.tf # если используете переменные
|
||
└── terraform.tfvars
|
||
```
|
||
|
||
---
|
||
|
||
### 2. Пример `main.tf`
|
||
|
||
```hcl
|
||
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
|
||
|
||
```bash
|
||
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.
|
||
|
||
---
|