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

---
