Настройка 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
}