# OpenTofu + Proxmox + Ubuntu Cloud-Init ### Полностью воспроизводимая установка (оффлайн провайдеры) Этот документ позволяет развернуть инфраструктурную машину (Ubuntu), установить OpenTofu, настроить оффлайн-провайдеры, подготовить шаблон Ubuntu Cloud-Init в Proxmox и выполнить первый `tofu plan`. ## 2. Установка OpenTofu ```bash sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://get.opentofu.org/opentofu.gpg \ | sudo tee /etc/apt/keyrings/opentofu.gpg >/dev/null curl -fsSL https://packages.opentofu.org/opentofu/tofu/gpgkey \ | sudo gpg --no-tty --batch --dearmor -o /etc/apt/keyrings/opentofu-repo.gpg >/dev/null sudo chmod a+r /etc/apt/keyrings/opentofu.gpg /etc/apt/keyrings/opentofu-repo.gpg echo "deb [signed-by=/etc/apt/keyrings/opentofu.gpg,/etc/apt/keyrings/opentofu-repo.gpg] \ https://packages.opentofu.org/opentofu/tofu/any/ any main" \ | sudo tee /etc/apt/sources.list.d/opentofu.list >/dev/null ``` ```sh sudo apt-get update sudo apt-get install -y tofu ``` Проверка: ```bash tofu version ``` ## Установка Golang Для компиляции должен быть установлен [Golang](https://go.dev/learn/) --- ## 3. Настройка оффлайн‑провайдеров Для работы OpenTofu без доступа к интернету провайдеры можно разместить локально в каталоге `~/.terraform.d/plugins/`. ### 3.1. Подготовка каталогов Создаём директории для оффлайн-провайдеров: ```bash mkdir -p ~/.terraform.d/plugins/registry.opentofu.org/bpg/proxmox mkdir -p ~/.terraform.d/plugins/registry.opentofu.org/hashicorp/{local,random,tls} ``` Ожидаемая структура после установки: ```sh /home/user/.terraform.d/ └── plugins └── registry.opentofu.org ├── bpg │ └── proxmox │ ├── 0.86.0 │ │ └── linux_amd64 │ │ └── terraform-provider-proxmox_v0.86.0 │ ├── 0.87.0 │ │ └── linux_amd64 │ │ └── terraform-provider-proxmox_v0.87.0 │ └── terraform-provider-proxmox_0.86.0_linux_amd64.zip └── hashicorp ├── local │ └── 2.6.1 │ └── linux_amd64 │ └── terraform-provider-local_v2.6.1 ├── random │ └── 3.7.2 │ └── linux_amd64 │ └── terraform-provider-random_v3.7.2 └── tls └── 4.1.0 └── linux_amd64 └── terraform-provider-tls_v4.1.0 ``` --- ### Провайдер **bpg/proxmox** Релизы: [https://github.com/bpg/terraform-provider-proxmox/releases](https://github.com/bpg/terraform-provider-proxmox/releases) Пример загрузки версии `0.86.0`: >>Пояснение: провайдер bpg/proxmox распространяется уже в собранном виде. Его не нужно компилировать - достаточно скачать ZIP‑файл с готовым бинарником распаковать и положить его в каталог зеркала. Это отличается от провайдеров hashicorp/local, random, tls, которые распространяются как исходники и требуют сборки через go build. Загрузить: ```bash wget https://github.com/bpg/terraform-provider-proxmox/releases/download/v0.86.0/terraform-provider-proxmox_0.86.0_linux_amd64.zip ``` Создать директорию: ```sh mkdir -p ~/.terraform.d/plugins/registry.opentofu.org/bpg/proxmox/0.86.0/linux_amd64 ``` Распаковать и переместить: ```sh unzip terraform-provider-proxmox_0.86.0_linux_amd64.zip -d /tmp mv /tmp/terraform-provider-proxmox_v0.86.0 \ ~/.terraform.d/plugins/registry.opentofu.org/bpg/proxmox/0.86.0/linux_amd64/ # Делаем исполняемым chmod +x ~/.terraform.d/plugins/registry.opentofu.org/bpg/proxmox/0.86.0/linux_amd64/terraform-provider-proxmox_v0.86.0 ``` --- ### 📌 Правильное размещение бинарников Hashicorp после компиляции После выполнения go build бинарники провайдеров необходимо разместить в строгой структуре, которую ожидает OpenTofu: ```sh ~/.terraform.d/plugins/registry.opentofu.org/hashicorp///linux_amd64/ ``` ### Провайдер **hashicorp/local** Релизы: [https://github.com/hashicorp/terraform-provider-local/releases/tag/v2.6.1](https://github.com/hashicorp/terraform-provider-local/releases/tag/v2.6.1) Загрузка и компиляция: ```bash wget https://github.com/hashicorp/terraform-provider-local/archive/refs/tags/v2.6.1.zip unzip v2.6.1.zip cd terraform-provider-local-2.6.1/ go build -o terraform-provider-local . ``` Переместить бинарник: ```bash mkdir -p ~/.terraform.d/plugins/registry.opentofu.org/hashicorp/local/2.6.1/linux_amd64 mv terraform-provider-local \ ~/.terraform.d/plugins/registry.opentofu.org/hashicorp/local/2.6.1/linux_amd64/terraform-provider-local_v2.6.1 ``` --- ### Провайдер **hashicorp/random** Релизы: [https://github.com/hashicorp/terraform-provider-random/releases/tag/v3.7.2](https://github.com/hashicorp/terraform-provider-random/releases/tag/v3.7.2) ```bash wget https://github.com/hashicorp/terraform-provider-random/archive/refs/tags/v3.7.2.zip unzip v3.7.2.zip cd terraform-provider-random-3.7.2/ go build -o terraform-provider-random . mkdir -p ~/.terraform.d/plugins/registry.opentofu.org/hashicorp/random/3.7.2/linux_amd64 mv terraform-provider-random \ ~/.terraform.d/plugins/registry.opentofu.org/hashicorp/random/3.7.2/linux_amd64/terraform-provider-random_v3.7.2 ``` --- ### Провайдер **hashicorp/tls** Релизы: [https://github.com/hashicorp/terraform-provider-tls/releases](https://github.com/hashicorp/terraform-provider-tls/releases) ```bash wget https://github.com/hashicorp/terraform-provider-tls/archive/refs/tags/v4.1.0.zip unzip v4.1.0.zip cd terraform-provider-tls-4.1.0/ go build -o terraform-provider-tls . ``` Бинарный файл переместить в каталог `tls`: ```bash mkdir -p ~/.terraform.d/plugins/registry.opentofu.org/hashicorp/tls/4.1.0/linux_amd64 mv terraform-provider-tls \ ~/.terraform.d/plugins/registry.opentofu.org/hashicorp/tls/4.1.0/linux_amd64/terraform-provider-tls_v4.1.0 ``` Исходники после сборки можно удалить. --- ## 4. Настройка `~/.tofurc` Файл конфигурации указывает OpenTofu использовать локальные провайдеры и не пытаться тянуть их из сети. **$USER** Обязательно замените, на ваш реальный путь. ```bash provider_installation { filesystem_mirror { path = "/home/$USER/.terraform.d/plugins" include = [ "registry.opentofu.org/bpg/proxmox", "registry.opentofu.org/hashicorp/local", "registry.opentofu.org/hashicorp/random", "registry.opentofu.org/hashicorp/tls" ] } direct { exclude = [ "registry.opentofu.org/bpg/proxmox", "registry.opentofu.org/hashicorp/local", "registry.opentofu.org/hashicorp/random", "registry.opentofu.org/hashicorp/tls" ] } } ``` --- Проверка: ```bash tofu init -reconfigure ``` Ожидаемое: `Installing provider ... from local filesystem`. --- ## 5. Создание API-токена Proxmox Минимальные права: * Datastore.AllocateSpace * VM.Allocate * VM.Audit * VM.Config.* --- ## 6. Конфиг токена на Ubuntu Файл: ```bash vim ~/.pve-creds ``` Содержимое: ``` export PVE_TOKEN_ID="root@pam!tofu" export PVE_TOKEN_SECRET="YOUR_SECRET" export PVE_HOST="192.168.22.5" ``` Загрузить: ```bash set -a source ~/.pve-creds set +a ``` Проверка: ```bash curl -k -H "Authorization: PVEAPIToken=${PVE_TOKEN_ID}=${PVE_TOKEN_SECRET}" \ https://$PVE_HOST:8006/api2/json/version ``` --- ## 7. Подготовка шаблона Ubuntu Cloud-Init в Proxmox ### 7.1. Скачать cloud image ```bash wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img -O ubuntu.img ``` ### 7.2. Создать VM под шаблон ```bash qm create 9001 --name ubuntu-template --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0 qm importdisk 9001 ubuntu.img local-lvm qm set 9001 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-9001-disk-0 qm set 9001 --ide2 local-lvm:cloudinit qm set 9001 --boot c --bootdisk scsi0 qm set 9001 --serial0 socket --vga serial0 ``` ### 7.3. Превратить VM в шаблон ```bash qm template 9001 ``` ---