Этой статьей я продолжаю тему по автоматизации установки и настройки внутри Proxmox.
Ранее я рассказывал как можно создавать шаблоны в Proxmox - слепок состояния виртуальной машины или LXC-контейнера на нужный нам момент времени; и как разворачивать вируальные машины с помощью cloud-init. Теперь воспользуемся знаниями, которые мы получили в прошлых статьях и пойдем по пути автоматизации развертывания нашей инфраструктуры еще дальше.
Зачем автоматизировать создание виртуальных машин?#
Ручное создание ВМ в Proxmox удобно на начальном этапе, но с ростом количества инстансов процесс становится трудоёмким и подверженным ошибкам.
Зачем автоматизировать создание виртуальных машин дома?#
То, что вы создаёте, должно поддерживаться. Ведь всё вашу, с таким трудом созданную инфрастуктуру, легко развалить или даже сломать, если оставить не уделять вопросу поддержки вашей системы должного внимания.
Вы потратили бесчисленные часы на построение своей инфраструктуры, выверяя каждую деталь, читая много статьей, мануалов, просмотрели кучу юутуб роликов разной степени полезности.
Но что, если что-то пойдёт не так, и вам придётся всё восстанавливать с нуля? Что, если весь ваш тяжёлый труд просто исчезнет по мановению случайного Ctrl+Alt+Del?
Тема статьи#
В этой статье сегодняшнем видео я покажу вам, как настроить Terraform для обслуживания вашей инфраструктуры, чтобы вам никогда не пришлось всё пересобирать заново.
Будь то небольшое изменение конфигурации или управление целыми виртуальными машинами — Terraform поможет вам всё держать под контролем.
Использование Terraform позволяет описать конфигурацию инфраструктуры как код (IaC), благодаря чему вы можете:
- Создавать ВМ с одинаковыми параметрами за секунды.
- Версионировать инфраструктуру.
- Интегрировать развертывание в CI/CD.
- Повысить воспроизводимость и предсказуемость среды.
На всякий случай поясню, что инфрастурктура как код - это когда мы с вами описываем аппаратную часть нашей системы в текстовом формате.
Что такое Terraform?#
Terraform — это инструмент от HashiCorp для управления инфраструктурой через конфигурационные файлы.
Terraform – это инструмент от компании Hashicorp, помогающий декларативно управлять инфраструктрой с помощью соответствующих конфигурационных файлов. А значит нам не надо вручную создавать виртуальные машины, сети и т.д. Достаточно написать конфигурацию, в которой будет изложено, как вы видите вашу будущую инфраструктуру. Такая конфигурация создается в текстовом формате yaml. Соответственно и изменения в нашу инфраструктуру тоже вносятся с помощью правок это текстового файла. Новичкам, по началу, это может показаться сложно и непонятно, но когда втянетесь, вы поймете всю прелесть хранения всей вашей инфраструктуры в паре текстовых файлов. При это Terraform поддерживает множество провайдеров, включая Proxmox VE. Но обо всем по порядку.
Варианты установки Terraform#
Как установить Terraform в Docker
Terraform может быть установлен несколькими способами, условно разделю их на два варианта: нативно и с помощью Docker. Я буду проделывать эту процедуру с помощью Docker. Почему?
Оба способа установки Terraform — нативно и через Docker — имеют свои плюсы и минусы. Выбор зависит от целей, окружения и предпочтений. Давайте посмотрим плюсы и минусы как это вижу я. Кстати, если не согласны, пишите в комментариях.
🔧 Нативная установка Terraform#
✅ Плюсы:#
- Простой и прямой доступ: можно вызывать
terraform
напрямую из терминала. - Интеграция с другими инструментами CLI: Ansible, Packer и пр.
- Поддержка IDE: автокомплит, подсветка синтаксиса и плагины в VS Code и других редакторах.
- Удобное редактирование и тестирование локально.
- Быстрее запускается, чем через Docker.
❌ Минусы:#
- Требует ручного контроля версий. Высока вероятность проблем в работе с провайдером о котором позже.
- Возможны конфликты между проектами с разными версиями Terraform.
- Нужно устанавливать и обновлять вручную.
Кому может подойти:#
Оптимально для локальной разработки, частой работы с инфраструктурой и гибкой настройки.
🐳 Установка Terraform с помощью Docker#
✅ Плюсы:#
- Не требует установки Terraform на хост.
- Легко переключаться между версиями с помощью тегов Docker-образа.
- Идеально для CI/CD пайплайнов (GitHub Actions, GitLab CI и пр.).
- Изоляция окружения — никакого конфликта зависимостей.
❌ Минусы:#
- Менее удобно для интерактивной работы.
- Требуется пробрасывать volume и пути вручную (-v $(pwd):/workspace).
- Медленнее запуск по сравнению с нативной установкой.
- Не работает напрямую с локальным SSH-агентом, переменными окружения без явного проброса.
Кому может подойти:#
Идеально подходит для автоматизации, CI/CD и одноразовых сценариев, когда важна изоляция среды. Для дома вообщем.
🏁 Выводы#
Сценарий | Рекомендованный подход |
---|---|
Локальная разработка, частая работа | Нативно |
Автоматизация и CI/CD | Docker |
Работа с несколькими версиями Terraform | Docker |
Гибкость и глубокая интеграция с системой | Нативно |
Установка Terraform#
Создаем директорию и назовем ее terraform, чтобы не запутаться
Шаг 1: Создание структуры проекта#
mkdir terraform
cd terraform
Создайте файл docker-compose.yml
со следующим содержимым:
services:
terraform:
image: hashicorp/terraform:latest #Официальный образ terraform
volumes:
- .:/terraform # маппим тома. Точка показывает, что установка будет в директорию terraform, в который мы с вами сейчас находимся
working_dir: /terraform # Описываем рабочую директорию. Она должна совпадать с той, что задана строчкой выше. В противном случае terraform обидется и не будет работать
network_mode: host # обязательно указываем тип сети как хост. Это нужно для того, что terraform мог взаимодействовать с proxmox и нам не нужно будет делать дополнительные настройки сети, которые понимают не только лишь все
Шаг 2: Установка расширения Terraform в VS Code#
Откройте VS Code → Extensions → найдите Terraform → Установите. Это расширение поможет нам взаимодействовать с Terraform, интерпретируя язык Terraform в понятную структуру
Шаг 3: Создаем файл с учётными данными#
Формально - учетные данные мы могли бы указать и в docker-compose.yml
, но это неправильно с точки зрения безопасности. Поэтому давайте хотя бы здесь постараюсь показать правильно.
Создайте файл в нашей директории командой :
touch credentials.auto.tfvars
# tv.vars означает переменные (variables) terraform
Пример содержимого credentials.auto.tfvars
:
proxmox_api_url = "https://<ВАШ_IP>:8006/api2/json"
proxmox_api_token_id = "root@pam!terraform"
proxmox_api_token_secret = "<ВАШ_СЕКРЕТ>" # proxmox показывает его один раз, поэтому сразу скопируйте
Создайте токен в Proxmox:
- Datacenter → Permissions → API Tokens → Add
- Пользователь:
root@pam
- Token ID:
terraform
- Снимите галочку с “Privilege Separation”
Шаг 4: Провайдер (provider.tf
)#
Сначала давайте определимся, что такое provider. Provider в нашем случае - это некий бридж между Terraform и вашей платформой, на которой вы разворачиваете Terraform. В нашем случае - это Proxmox VE, но в продакшене это может быть любая серьезная облачная инфраструктура типа AWS, Azure и т.д. При этом для каждой платформы свой провайдер.
Мы будем использовать провайдера от Telmate. Связано это с тем, что официального провайдера для Proxmox от разработчиков нет. И тут есть один хитрый момент. У этого провайдера есть проблемы с версионностью. То есть не каждая версия провайдера
заведется с разными версиями Proxmox VE. В интернете по этому поводу всегда много стонов. Очень похожая ситуация с Nextcloud - всем нужен, все плачут, но продолжают использовать.
Открываем Terraform Registry → ищем terraform proxmox
→ выбираем ссылку от Telmate.
Нажимаем “Use Provider” и копируем предложенный код в наш файл для данных провайдера.
После заполнения скопированной части файла, - ниже, на той же странице будут переменные, которые я использую в конфигруаационном файле Содержимое:
terraform {
required_providers {
proxmox = {
source = "Telmate/proxmox" # описываем источник, откуда мы берем провайдера
version = "2.9.14" # указываем версию, которую мы хотим использовать
}
}
}
# ниже указано конфигурационная часть.
provider "proxmox" { # название должно совпадать с название провайдера, заданного выше
pm_api_url = var.proxmox_api_url
pm_api_token_id = var.proxmox_api_token_id
pm_api_token_secret = var.proxmox_api_token_secret
pm_tls_insecure = true # этой переменной мы говорим Terraform не бояться самоподписанных сертификатов, которые идут в Proxmox
}
variable "proxmox_api_url" {
type = string
}
variable "proxmox_api_token_id" {
type = string
}
variable "proxmox_api_token_secret" {
type = string
}
С этой частью закончили, переходим к инициализации всего того что мы только что с вами натворили.
Шаг 5: Инициализация Terraform#
В терминале идем в директорию где у нас находятся наши файлы.
Вводим следующую команду
docker compose -f docker-compose.yml run --rm terraform init
Сейчас поясню, что это значит.
В своих роликах я никогда не запускал докер с флагом -f, но тут особый случай.
Флаг -f определяет какой конкретно файл надо запустить. В нашем случае docker-compose.yml
.
Команда –rm говорит, что контейнер должен быть удален, после того, как он выполнит свои темные делишки.
Запускаем команду. После того как контейнер будут скачан, наш проект будет запущен. То есть скачивается контейнер Terraform, скачивается провайдер, установливаются все необходимые бекэнд файлы. В итоге мы должны получить сообщение, что все инициализированно. В нашей директории Terraform мы увидим новые файлы. Трогать их нам не надо, но просто само их наличие говорит о том, что все в порядке. Так и должно быть. Terraform проверяет, - может ли он соедениться с ProxmoxVE
Шаг 6: Проверка текущего состояния#
Запускаем следующую команду.
docker-compose -f docker-compose.yml run --rm terraform plan
Как вы видите команда не особо отличивается от предыдущей, кроме последнего значения. Эта команда нужна, чтобы проверить, какие именно изменения будут применены, но без фактического применения. Этакий тестовый прогон. Поэтому если на этом этапе что-то не так, то дальше нам надо понять что не так. Но никакие изменения в работающую инфраструктуру не вносятся. Пока мы ничего не конфигурировали, никаких изменений не применяли, то Terraform скажет, что всё актуально. Это нормально.
Шаг 7: Создание первой виртуальной машины (production.tf
)#
Давайте заставим Terraform создать первую виртуальную машину на Ubuntu из нашего предварительно созданного шаблона. Пора уже заняться всем по взрослому
Прежде всего опять зайдем на сайт Telmate и подглядим там нужные нам переменные в разделе proxmox_vm_qemu.
Создаем соответствующий файл с название production.tf, мы будем задавать значения для нашей виртуальной машины
touch production.tf
Пример содержимого:
resource "proxmox_vm_qemu" "terraform" {
vmid = 800
name = "terraform"
target_node = "beliasrius"
clone = "ubuntu-template" # наименование шаблона из которого мы все разворачиваем
full_clone = true # нам нужен полный клон, а не связанный клон (linked clone)
#
bios = "ovmf"
agent = 1 # подтверждаем, что у нас установлен qemu-guest-agent в нашем шаблоне
scsihw = "virtio-scsi-single"
os_type = "ubuntu"
cpu = "x86-64-v2-AES"
cores = 2
sockets = 1
memory = 2048
disks {
scsi {
scsi0 {
disk {
size = "32G"
type = "scsi"
storage = "local"
format = "qcow2"
}
}
}
}
}
Теперь давайте еще раз применим уже известную нам команду
docker-compose -f docker-compose.yml run --rm terraform plan
Соответственно Terraform должен показать все изменения, которые он должен применить.
Шаг 8: Применение конфигурации#
Давайте теперь уже начнем разворачивать нашу виртуальную машину соответствующей командой.
docker-compose -f docker-compose.yml run --rm terraform apply
Нужно будет подтвердить наше желание начать уже вводом текстового сообщения:
yes
Теперь начнётся клонирование ВМ в Proxmox, статус будет виден в логах ProxmoxVE. После завершения ВМ автоматически запустится.
В Summary вы увидите IP — благодаря guest-agent.
Можно открыть консоль — ВМ загружена и готова.
Шаг 9: Тест восстановления#
Давайте теперь проверим как у нас работает процесс восстановления. Так как мы с вами все сделали с помощью Terraform, то вот пусть теперь он за подержку нашей инфраструктуры и отвечает.
Удалим ВМ вручную в ProxmoxVE, затем опять введем уже известную нам команду :
docker-compose -f docker-compose.yml run --rm terraform apply
Шаг 10: Обновление конфигурации#
Давайте изменим нашу конфигурацию ВМ, например:
memory = 8192
cores = 2
Повторно примените:
docker-compose -f docker-compose.yml run --rm terraform apply
Пару секунду и вуаля, у нас все обновилось.
Если эта статья вам помогла, томожете подписаться на мой ютуб канал и стать спонсором на бусти.