Перейти к содержанию

Начало работы с Terraform

В этой статье

Terraform — очень удобный инструмент для быстрого создания облачной инфраструктуры и управления ей при помощи конфигурационных файлов. Когда конфигурационные файлы изменяются, Terraform автоматически реагирует на это и отдает соответствующие команды на добавление или удаление нужных администратору ресурсов. В статье мы расскажем, как при помощи Terraform (также будем использовать сокращение TF) создать виртуальную инфраструктуру (VPS и выделенные серверы) в Hostkey.

Подробная документация и исходный код провайдера доступны в нашем репозитории на GitHub: https://github.com/hkadm/terraform-provider-hostkey.

Шаг 1. Устанавливаем Terraform

Terraform можно установить на Linux, macOS и Windows. Установка возможна двумя способами:

  • через пакетный менеджер;
  • вручную — загрузкой и распаковкой готового бинарного файла.

Рассмотрим второй способ — установку вручную, с использованием предварительно собранного бинарного файла.

Актуальную версию Terraform всегда можно посмотреть на официальном сайте HashiCorp (на текущий момент стабильная линейка релизов — 1.15.x). Для примера рассмотрим установку версии 1.15.0 для Linux.

Linux

Скачайте архив с бинарным файлом:

wget https://releases.hashicorp.com/terraform/1.15.0/terraform_1.15.0_linux_amd64.zip

Распакуйте архив:

unzip ./terraform_1.15.0_linux_amd64.zip

Переместите файл в директорию /usr/local/bin:

sudo mv ./terraform /usr/local/bin

Убедитесь, что Terraform установлен:

terraform -v

Шаг 2. Создаем конфигурационный файл .tf

Файлы конфигураций в Terraform имеют расширение .tf. При этом их название может быть произвольным — программа всё равно сможет извлечь из них нужную информацию. Теперь давайте создадим новый каталог (назовем его hostkey_project), а затем добавим туда файл конфигураций, к примеру, main.tf. Чтобы получить файл с таким расширением, можно сначала создать обычный текстовый файл, а затем изменить его расширение на .tf.

Отметим, что в одном каталоге может быть несколько конфигурационных файлов, связанных с одним проектом. Например, можно создать файл variables.tf для описания переменных, dns.tf для настройки доменов и так далее. В дальнейшем при выполнении команды terraform plan все .tf-файлы будут «склеены» в один.

Однако в рамках данной статьи мы будем использовать один общий конфигурационный файл main.tf.

Шаг 3. Настраиваем провайдера

Настройка провайдера через конфигурационный файл выполняется следующим образом. В начало нашего файла main.tf добавляем следующие строки:

terraform {
  required_providers {
    hostkey = {
      source  = "hkadm/hostkey"
      version = "~> 0.1"
    }
  }
  required_version = ">= 1.0"
}

В source указывается адрес провайдера Hostkey. Также учитывайте, что провайдер поддерживает версии Terraform 1.0 и выше (включая актуальные 1.15.x).

Теперь введите в папке с конфигурационным файлом следующую команду, которая инициализирует провайдера:

terraform init

Примечание

Пока провайдер не опубликован в официальном Terraform Registry, для локальной разработки может потребоваться использование go install и dev_overrides (подробнее в файле CONTRIBUTING.md в репозитории).*

Можно приступать к следующему шагу. Если же у вас возникла проблема с установкой провайдера, вы всегда можете обратиться к специалистам службы поддержки Hostkey.

Шаг 4. Создаем и указываем API-ключ

Чтобы появилась возможность работать с установленным провайдером, нам понадобится API-ключ. Его можно создать в панели управления InvAPI: перейдите в раздел Configuration → API keys.

Допустим, мы получили ключ. Безопаснее всего передавать его через переменные окружения, например:

export HOSTKEY_API_KEY="ваш-api-ключ"

Либо (для простоты примера) добавить его напрямую в файл main.tf следующим образом:

provider "hostkey" {
  region  = "RU" # или COM — выбирает endpoint биллинга/API (.ru / .com)
  api_key = "ваш-api-ключ"
}

Внимание

Параметр region в блоке провайдера выбирает только API-endpoint (InvAPI .ru или .com). Физический дата-центр, где будет размещен сервер, задается позже внутри самого ресурса через параметр location_name.

Провайдер автоматически обменяет этот ключ на сессионный токен и будет использовать его для запросов к API.

Шаг 5. Готовим конфигурацию

С помощью Terraform вы сможете управлять разнообразными типами ресурсов в Hostkey: заказывать серверы (hostkey_server), добавлять IP-адреса (hostkey_server_ip), управлять SSH-ключами (hostkey_ssh_key) и настраивать DNS-зоны (hostkey_dns_domain, hostkey_dns_record).

Рассмотрим пример создания виртуальной машины (VPS). Мы будем использовать пресет vm.pico, операционную систему Ubuntu 22.04, тариф трафика 3 TB / 1 Gbps VM и разместим сервер в дата-центре в Нидерландах (NL). Период оплаты выберем помесячно (monthly).

Для этого в конфигурационном файле main.tf прописываем следующее:

terraform {
  required_providers {
    hostkey = {
      source  = "hkadm/hostkey"
      version = "~> 0.1"
    }
  }
  required_version = ">= 1.0"
}

provider "hostkey" {
  region  = "RU"
  api_key = "ваш-api-ключ"
}

resource "hostkey_server" "web" {
  preset_name       = "vm.pico"
  location_name     = "NL"
  os_name           = "Ubuntu 22.04"
  traffic_plan_name = "3 TB / 1 Gbps VM"
  deploy_period     = "monthly"
  root_pass         = "ВашНадежныйПароль123!"
}

Также для дальнейшей работы рекомендуется добавить SSH-ключ в хранилище аккаунта. Для загрузки SSH-ключа добавьте следующий блок:

resource "hostkey_ssh_key" "my_key" {
  name       = "my-key"
  public_key = file("~/.ssh/id_rsa.pub")
}

Примечание

Обратите внимание, что указывать нужно только публичный ключ SSH.

В итоге у нас получится следующий файл конфигурации:

terraform {
  required_providers {
    hostkey = {
      source  = "hkadm/hostkey"
      version = "~> 0.1"
    }
  }
  required_version = ">= 1.0"
}

provider "hostkey" {
  region  = "RU"
  api_key = "ваш-api-ключ"
}

resource "hostkey_ssh_key" "my_key" {
  name       = "my-key"
  public_key = file("~/.ssh/id_rsa.pub")
}

resource "hostkey_server" "web" {
  preset_name       = "vm.pico"
  location_name     = "NL"
  os_name           = "Ubuntu 22.04"
  traffic_plan_name = "3 TB / 1 Gbps VM"
  deploy_period     = "monthly"
  root_pass         = "ВашНадежныйПароль123!"
}

Внимание

  • Заказ сервера — это платная операция.
  • Процесс развертывания (deploy) может занять от десятков минут до полутора часов.
  • Если вам нужны специфические параметры, вы можете использовать источники данных (Data Sources), такие как hostkey_presets, hostkey_oses или hostkey_traffic_plans, чтобы динамически подставлять их ID или имена.

На этом подготовка завершена, осталось выполнить пару простейших шагов.

Шаг 6. Проверяем конфигурацию

Это делает команда:

terraform validate

При правильных настройках вы получите сообщение о том, что конфигурация корректна (Success). Если возникла ошибка, проверьте синтаксис HCL и настройки еще раз. Теперь осталось применить конфигурацию.

Шаг 7. Применяем конфигурацию

Сначала вводим следующую инструкцию:

terraform plan

Она не применяет изменения, а только выводит список ресурсов для проверки настроек (план изменений). При обнаружении ошибок Terraform укажет, где они допущены. Если же всё в порядке, вводим:

terraform apply

Эта инструкция применяет созданные конфигурации, так что ваши ресурсы будут заказаны и начнут создаваться. Но для применения изменений их сначала нужно будет подтвердить, поэтому в строке:

Enter a value:

вводим yes и нажимаем Enter.

Теперь можно проверить статус созданных ресурсов через панель управления Hostkey. Если же по каким-то причинам вы решите удалить их, это можно сделать при помощи инструкции:

terraform destroy

Операцию также нужно будет подтвердить, введя yes.

Внимание

Команда destroy вызывает отмену услуги (процедуру whmcs/request_cancellation). При необходимости тип и причину отмены можно задать через параметры cancellation_type и cancellation_reason внутри ресурса hostkey_server.

Информация

Если вы хотите узнать об инструкциях Terraform больше, ознакомиться с ними можно в официальной документации HashiCorp, а специфичные параметры ресурсов и источников данных Hostkey описаны в каталоге docs/ нашего GitHub-репозитория.

question_mark
Я могу вам чем-то помочь?
question_mark
ИИ Помощник ×