База знаний

Настройка Terraform для управления сервисом CLO

Утилита Terraform позволяет управлять проектами CLO с помощью удобного языка описания инфраструктуры. Такой подход упрощает создание и администрирование сложных проектов, предоставляет понятное и полное описание доступных ресурсов проекта и связей между ними, а также снижает вероятность человеческих ошибок при управлении сетевыми ресурсами.

Установка Terraform

Используйте официальную документацию для установки приложения Terraform.

Провайдер CLO доступен на Github и в официальном репозитории HashiCorp.

Подключение Terraform к сервису

Создайте каталог манифестов, и в нём файл манифеста main.tf для данных о конфигурации Terraform.

В файле манифеста перечисляются провайдеры Terraform, необходимые для создания инфраструктуры. При запуске манифеста провайдер будет автоматически загружен из репозитория HashiCorp.

Примечание. Для ручной установки провайдера обратитесь к соответствующему разделу официальной документации.

Добавьте в файл следующий блок:

terraform {
  required_providers {
	clo = {
  	version = "2.0.1"
  	source = "clo-ru/clo"
	}
  }
}

provider "clo" {
 auth_url = "https://api.clo.ru"
 token = <mysecrettoken>
}

Примечание. Актуальные версии провайдера можно найти в официальной документации, нажав на кнопку USE PROVIDER.

Провайдер использует API-токен для запросов, отправляемых провайдеру. Токен можно создать в Личном кабинете → меню-гамбургер слева сверху → АккаунтТокены API.

Описание плана инфраструктуры 

Опишите в файле main.tf план инфраструктуры. Добавьте описание ресурсов, используя документацию к провайдеру.

Совет. Вы можете использовать примеры из GitHub-репозитория.

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

terraform init

Проверьте, что план инфраструктуры не содержит ошибок:

terraform plan

Программа выведет список ресурсов, готовых к созданию. Если план инфраструктуры содержит ошибки, устраните их и повторите предыдущую операцию.

Далее разверните инфраструктуру и создайте необходимые ресурсы командой:

terraform apply

В панели управления будут автоматически отображены все созданные ресурсы.

Изменение инфраструктуры 

Для изменения инфраструктуры отредактируйте файл манифеста и выполните команду:

terraform apply

Примечание. Изменения в инфраструктуре, сделанные через панель управления, в файле манифеста не записываются и не отображаются.

Удаление инфраструктуры

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

terraform destroy

Примечание. Ресурсы инфраструктуры, удалённые с помощью панели управления, не удаляются автоматически из файла манифеста.

Пример плана инфраструктуры 

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

  • облачный сервер с загрузочным сетевым диском из образа Ubuntu 20.04 LTS 64-bit, с произвольной конфигурацией с 2 vCPU и 4 ГБ RAM, сетевой диск 40 ГБ, внешний IP-адрес.
  • дополнительный внешний IP-адрес
  • привязку нового IP-адреса к облачному серверу.

План описан в виде файла main.tf. В этом файле хранится описание создаваемых ресурсов и объявлены переменные, которые могут затем использоваться в других файлах манифестов.

Файл main.tf

variable "os_name" {
default = "Ubuntu 20"
}

# Инициализация Terraform и конфигурации провайдеров
terraform {
  required_providers {
    clo = {
      version = "2.0.1"
      source = "clo-ru/clo"
    }
  }
}

# Указываем данные для аутентификации
provider "clo" {
  auth_url = "https://api.clo.ru"
  token = "указать-токен-из-раздела-токены-api-в-личном-кабинете"
}

# Получаем список проектов
data "clo_projects" "all_projects" {
}

locals  {
  pr_id = data.clo_projects.all_projects.results[0].id
}

# Получаем ID образа операционной системы. Имя образа берем из переменных.
data "clo_project_image" "ubuntu" {
  project_id = local.pr_id
  name = var.os_name
}

# Создаем дополнительный IP-адрес
resource "clo_network_ip" "fip_1" {
  project_id = local.pr_id
}

# Создаем сервер с нужными параметрами
resource "clo_compute_instance" "serv" {
  project_id = local.pr_id
  name = "my_server"
  flavor_ram = 4
  flavor_vcpus = 2
  # Используем ID образа, полученный ранее
  image_id = data.clo_project_image.ubuntu.image_id
  block_device{
    bootable=true
    storage_type = "volume"
    size = 40
  }
  addresses{
    version = 4
    external=true
    ddos_protection=false
  }
}

# Подключение нового адреса к серверу.
resource "clo_network_ip_attach" "attach_ip"{
  address_id = clo_network_ip.fip_1.id
  entity_name = "server"
  entity_id = clo_compute_instance.serv.id
}

# Вывод ID созданного сервера.
output "server" {
  value = resource.clo_compute_instance.serv.id
}