9.3 KiB
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