Terraform — это программное обеспечение для управления внешней инфраструктурой. С помощью Terraform вы можете управлять ресурсами VMmanager  — виртуальными машинами (ВМ), сетями и т.д.

В Terraform используется подход Infrastructure as code — все команды и настройки для ресурсов передаются через конфигурационные файлы. В конфигурационных файлах используется декларативный язык HCL (HashiCorp Configuration Language). Подробнее о Terraform см. в официальной документации.

Terraform взаимодействует с объектами инфраструктуры с помощью специального набора инструкций — провайдера. Документация к провайдеру для VMmanager доступна на ресурсах registry.terraform.io и github.com.

Установка Terraform


Стандартный способ

CentOS

  1. Выполните команды: 

    yum install -y yum-utils
    CODE
    yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
    CODE
    yum -y install terraform
    CODE
  2. Создайте отдельную директорию для Terraform: 

    mkdir ./terraform
    CODE

Debian, Ubuntu

  1. Выполните команды: 

    apt-get update && apt-get install -y gnupg software-properties-common curl
    CODE
    curl -fsSL https://apt.releases.hashicorp.com/gpg | apt-key add -
    CODE
    apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
    CODE
    sudo apt-get update && sudo apt-get install terraform
    CODE
  2. Создайте отдельную директорию для Terraform:

    mkdir ./terraform
    CODE

macOS

  1. Если в системе не установлен менеджер пакетов Homebrew, установите его: 

    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    CODE
  2. Выполните команды:

    brew tap hashicorp/tap
    CODE
    brew install hashicorp/tap/terraform
    CODE
    brew update
    CODE
    brew upgrade hashicorp/tap/terraform
    CODE
  3. Создайте отдельную директорию для Terraform:

    mkdir ./terraform
    CODE

Windows

  1. Скачайте версию Terraform для Windows.
  2. Распакуйте содержимое архива в отдельную директорию. Например, C:\Apps\Terraform\.
  3. Добавьте путь к директории с Terraform в системную переменную PATH. Порядок добавления зависит от версии ОС.

Альтернативный способ

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

  1. Распакуйте содержимое архива в отдельную директорию.
  2. Добавьте путь к директории в системную переменную PATH: 

    Команда для Linux

    export PATH=$PATH:/path/to/terraform
    CODE

    /path/to/terraform — путь к директории с Terraform

Подготовка конфигурации


Чтобы подготовить конфигурацию, создайте в директории с Terraform файл main.tf. 

# Инициализация провайдера для VMmanager
terraform {
  required_providers {
    vmmanager6 = {
      source = "usaafko/vmmanager6"
      version = ">= 0.0.25"
    }
  }
}

provider "vmmanager6" {
# E-mail администратора
  pm_email = "admin@example.com"
# Пароль администратора
  pm_password = "secret"
# URL сервера с платформой
  pm_api_url     = "https://vmmanager.example.com"
}

# Описание создаваемого ресурса - виртуальной машины (ВМ)
resource "vmmanager6_vm_qemu" "test_vm" {
# Имя ВМ
  name = "My_vm"
# Описание ВМ
  desc = "Testing Terraform"
# Количество ядер CPU
  cores = 1
# Количество RAM, Mb
  memory = 512
# Объём дискового пространства
  disk = 5000
# id шаблона операционной системы
  os = 1
# Пароль администратора ВМ
  password = "vmsecret"
# id кластера
  cluster = 1
# Владелец ВМ. Terraform создаст аккаунт владельца на основе данных
# из ресурса "user" и сохранит его в этом параметре. Вместо 
# переменной вы можете указать id существующего пользователя.
  account = "${vmmanager6_account.user.id}"
# Доменное имя ВМ
  domain = "test.example.com"
# Ресурсы, от которых зависит создание ВМ - физическая сеть,
# пул IP-адресов и пользователь. В первую очередь Terraform
# создаст указанные объекты, а затем ВМ.
  depends_on = [vmmanager6_network.net1, vmmanager6_pool.pool1, vmmanager6_account.user  ]
# Из какого пула взять IP-адрес для ВМ. Terraform создаст пул 
# на основе данных из ресурса "pool1" и сохранит его в этом
# параметре. Вместо переменной вы можете указать id
# существующего пула. 
  ipv4_pools = [ "${vmmanager6_pool.pool1.id}" ]
# Количество IP-адресов
  ipv4_number = 1
}

# Описание создаваемого ресурса - физической сети
resource "vmmanager6_network" "net1" {
# Сеть в формате <адрес сети>/<префикс маски сети>
  network = "172.31.240.0/20"
# IP-адрес шлюза
  gateway = "172.31.255.254"
# Описание сети
  desc = "Terraform network"
}

# Описание создаваемого ресурса - пула IP-адресов
resource "vmmanager6_pool" "pool1" {
# Имя пула
  pool = "terraform"
# Описание пула
  desc = "Terraform pool"
# Блок IP-адресов, входящих в пул
  ranges = ["172.31.247.16/30"]
# Зависимый ресурс - физическая сеть. Terraform создаст пул 
# только после создания физической сети.
  depends_on = [vmmanager6_network.net1]
}

# Описание создаваемого ресурса - учётной записи пользователя
resource "vmmanager6_account" "user" {
# E-mail пользователя
  email = "user@example.com"
# Пароль пользователя
  password = "usersecret"
# Роль пользователя
  role = "@advanced_user"
# Публичный SSH-ключ пользователя. Необязательный параметр. 
# Без указания SSH-ключа пользователь сможет подключиться 
# к ВМ только по паролю.
  ssh_keys {
# Имя пользователя SSH-ключа
    name = "user123"
# Содержимое публичного SSH-ключа
    ssh_pub_key = "ecdsa-sha2-nistp256 AAAAE2VjZ....user@example.com"
  }
}
CODE

Создание ресурсов


  1. Инициализируйте проект конфигурации: 

    terraform init
    CODE

    Если ресурс с провайдером недоступен, ответ будет содержать ошибку вида 

    │ Error: Failed to query available provider packages
    │ 
    │ Could not retrieve the list of available versions for provider
    │ usaafko/vmmanager6: could not connect to registry.terraform.io: Failed to
    │ request discovery document: 403 Forbidden
    CODE

    В этом случае вы можете установить провайдер локально: 

    Обратите внимание!

    Локальная установка провайдера возможна только на ПК с ОС семейства Linux.

    1. Выполните команды: 

      mkdir -p ~/.terraform.d/plugins/localhost/usaafko/vmmanager6/0.0.25/linux_amd64/
      CODE
      curl -L https://github.com/usaafko/terraform-provider-vmmanager6/releases/download/v0.0.25/terraform-provider-vmmanager6_0.0.25_linux_amd64.zip -o terraform-provider-vmmanager6.zip
      CODE
      unzip terraform-provider-vmmanager6.zip
      CODE
      mv terraform-provider-vmmanager6_v0.0.25 ~/.terraform.d/plugins/localhost/usaafko/vmmanager6/0.0.25/linux_amd64/terraform-provider-vmmanager6
      CODE
    2. В файле main.tf замените строку 

      source = "usaafko/vmmanager6" 
      CODE

      на 

      source = "localhost/usaafko/vmmanager6"
      CODE
    3. Инициализируйте проект конфигурации: 

      terraform init
      CODE
  2. Проверьте синтаксис конфигурационного файла: 

    terraform validate
    CODE

    Если конфигурация является допустимой, ответ будет содержать сообщение: 

    Success! The configuration is valid.
    CODE
  3. Проверьте, что ресурсы будут созданы с нужной конфигурацией: 

    terraform plan
    CODE

    Вывод команды будет содержать список создаваемых ресурсов и их свойства. При необходимости вы можете исправить файл конфигурации и повторить выполнение команды.

  4. Запустите создание ресурсов: 

    terraform apply
    CODE

    Чтобы подтвердить создание ресурсов, введите yes и нажмите Enter.

Изменение ресурсов


Чтобы изменить созданные ресурсы:

  1. Измените настройки ресурсов в файле main.tf.
  2. Выполните команду:

    terraform apply
    CODE

    Чтобы подтвердить изменение ресурсов, введите yes и нажмите Enter.

Если часть ресурсов уже была создана, Terraform не будет пересоздавать их.

Удаление ресурсов


Чтобы удалить созданные ресурсы, выполните команду: 

terraform destroy
CODE

После выполнения команды в терминале будет выведен список удаляемых ресурсов. Чтобы подтвердить удаление, введите yes и нажмите Enter.

Обратите внимание!

После выполнения этой команды восстановление ресурсов невозможно.