Files
opentofu-standart-vm/stat2.md
Iurii Anfinogenov e40ee15da1 Init commit
2026-04-13 17:48:41 +00:00

9.3 KiB
Raw Blame History

OpenTofu + Proxmox + Ubuntu Cloud-Init

Полностью воспроизводимая установка (оффлайн провайдеры)

Этот документ позволяет развернуть инфраструктурную машину (Ubuntu), установить OpenTofu, настроить оффлайн-провайдеры, подготовить шаблон Ubuntu Cloud-Init в Proxmox и выполнить первый tofu plan.

2. Установка OpenTofu

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
sudo apt-get update
sudo apt-get install -y tofu

Проверка:

tofu version

Установка Golang

Для компиляции должен быть установлен Golang


3. Настройка оффлайн‑провайдеров

Для работы OpenTofu без доступа к интернету провайдеры можно разместить локально в каталоге ~/.terraform.d/plugins/.

3.1. Подготовка каталогов

Создаём директории для оффлайн-провайдеров:

mkdir -p ~/.terraform.d/plugins/registry.opentofu.org/bpg/proxmox
mkdir -p ~/.terraform.d/plugins/registry.opentofu.org/hashicorp/{local,random,tls}

Ожидаемая структура после установки:

/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

Пример загрузки версии 0.86.0:

Пояснение: провайдер bpg/proxmox распространяется уже в собранном виде. Его не нужно компилировать - достаточно скачать ZIPфайл с готовым бинарником распаковать и положить его в каталог зеркала. Это отличается от провайдеров hashicorp/local, random, tls, которые распространяются как исходники и требуют сборки через go build.

Загрузить:

wget https://github.com/bpg/terraform-provider-proxmox/releases/download/v0.86.0/terraform-provider-proxmox_0.86.0_linux_amd64.zip

Создать директорию:

mkdir -p ~/.terraform.d/plugins/registry.opentofu.org/bpg/proxmox/0.86.0/linux_amd64

Распаковать и переместить:

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:

~/.terraform.d/plugins/registry.opentofu.org/hashicorp/<provider>/<version>/linux_amd64/

Провайдер hashicorp/local

Релизы: https://github.com/hashicorp/terraform-provider-local/releases/tag/v2.6.1

Загрузка и компиляция:

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 .

Переместить бинарник:

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

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

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:

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 Обязательно замените, на ваш реальный путь.

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"
    ]
  }
}

Проверка:

tofu init -reconfigure

Ожидаемое: Installing provider ... from local filesystem.


5. Создание API-токена Proxmox

Минимальные права:

  • Datastore.AllocateSpace
  • VM.Allocate
  • VM.Audit
  • VM.Config.*

6. Конфиг токена на Ubuntu

Файл:

vim ~/.pve-creds

Содержимое:

export PVE_TOKEN_ID="root@pam!tofu"
export PVE_TOKEN_SECRET="YOUR_SECRET"
export PVE_HOST="192.168.22.5"

Загрузить:

set -a
source ~/.pve-creds
set +a

Проверка:

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

wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img -O ubuntu.img

7.2. Создать VM под шаблон

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 в шаблон

qm template 9001