Init commit
This commit is contained in:
292
start.md
Normal file
292
start.md
Normal file
@@ -0,0 +1,292 @@
|
||||
# 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
|
||||
```
|
||||
|
||||
---
|
||||
Reference in New Issue
Block a user