293 lines
9.3 KiB
Markdown
293 lines
9.3 KiB
Markdown
# 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/<provider>/<version>/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
|
||
```
|
||
|
||
---
|