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