Перейти к основному содержимому
  1. Статьи/

Автоматическая установка виртуальных машин в Proxmox с помощью Terraform в Docker

·1857 слов·9 минут· loading · loading · ·
Инфраструктура Автоматизация Proxmox
Stilicho2011
Автор
Stilicho2011
Site owner
Оглавление
Автоматизация в Proxmox - This article is part of a series.
Part : This Article

Этой статьей я продолжаю тему по автоматизации установки и настройки внутри 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/CDDocker
Работа с несколькими версиями TerraformDocker
Гибкость и глубокая интеграция с системойНативно

Обратите внимание В видео ролике я использую VS Code, как более простой инструмент. Я предполагаю, что у вас уже настроена виртуальная машина в Proxmox и установлен docker, а также подготовлен шаблон виртуальной машины на Ubuntu в Proxmox VE, как мы это с вами делали в предыдущей статье.

Установка 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 показывает его один раз, поэтому сразу скопируйте 
Правильно создавать конечно отдельного юзера и задать ему сначала соответствующие права. Но я хочу для целей этой статьи сделать все проще, поэтому использую пользователя root. С точки зрения безопасности - это не правильно!

Создайте токен в 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

Пару секунду и вуаля, у нас все обновилось.

Если эта статья вам помогла, томожете подписаться на мой ютуб канал и стать спонсором на бусти.

Автоматизация в Proxmox - This article is part of a series.
Part : This Article