terraform-proxmox-simple/README.md

237 lines
5.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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.
---