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

293 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
```
---