Skip to content

Selectel some examples of terraform modules

License

Notifications You must be signed in to change notification settings

selectel/selectel-infra-examples

Repository files navigation

Selectel Terraform Modules Example

Pipeline Status Version
Terraform - Selectel Terraform modules version - Версия до BSL лицензии
OpenTofu - Selectel Terraform modules version

В данном репозитории находятся примеры Terraform модулей, используемых для создания инфраструктуры в облаке Selectel. С учетом нынешних реалий в репозитории Вы можете найти ежедневные пайплайны проверки создания ресурсов через Terraform и OpenTofu.

P.S. Если Вы не нашли пример для создания определенного ресурса - Вы можете оставить issue и мы примем во внимание необходимость его добавления.

Перед началом работы с облачными ресурсами Selectel через Terraform/OpenTofu рекомендуем ознакомиться с документацией по провайдеру Selectel/OpenStack.

ВАЖНО! С версии репозитория >= 2.0.1 было добавлено тестирование запуска terraform кода через OpenTofu. В связи с блокировкой terraform registry из РФ. Необходимость в terraform-proxy или terraform-mirror усложняет использование terraform. OpenTofu позволяет без проксей, зеркал и изменений в коде использовать все теже провайдеры, что лежат в registry.terraform.io. Все провайдеры OpenTofu лежат в репозитории - ссылка. Так же документация по провайдерам от OpenTofu - ссылка.

Использование

Далее все команды terraform-cli могут быть заменены на tofu. Будут работать оба варианта.

Перед использованием проверьте версию Terraform/OpenTofu, данный репозиторий гарантирует запуск Terraform кода только на определенной версии Terraform/OpenTofu - смотри в шапке README.

Так же убедитесь, что в вашем env нет других переменных вида "OS_*" их наличие повлияет на провайдер Openstack!

1. Terraformrc

Для того чтобы у Вас не было проблем при использовании репозитория - были перенесены все используемые провайдеры в папку providers. Чтобы заставить terraform cмотреть в эту папку потребуется создать файл terraformrc:

cat <<EOS >> $HOME/.terraformrc
provider_installation {
    filesystem_mirror { 
      path    = "$GITHUB_WORKSPACE/providers"
      include = ["registry.terraform.io/*/*"]
    }
}
EOS

2. State File

По-умолчанию в репозитории стейт хранится в s3. Для локального запуска потребуется изменить на local в файле versions.tf:

terraform {
  backend "local" {}
}
Пример передачи `backend` для хранения стейта в S3 через CLI:
terraform init
  -backend-config="bucket=< имя бакета s3 >"
  -backend-config="endpoint=s3.ru-1.storage.selcloud.ru"
  -backend-config="key=< имя стейт-файла >.tfstate"
  -backend-config="region=ru-1"
  -backend-config="skip_region_validation=true"
  -backend-config="skip_credentials_validation=true"
  -backend-config="access_key=< S3_ACCESS_KEY >"
  -backend-config="secret_key=< secrets.S3_SECRET_KEY >"
Через tf файл:
terraform {
  backend "s3" {
    bucket     = "< имя бакета s3 >"
    endpoint   = "s3.ru-1.storage.selcloud.ru"
    key        = "< имя стейт-файла >.tfstate"
    region     = "ru-1"
    access_key = "< S3_ACCESS_KEY >"
    secret_key = "< secrets.S3_SECRET_KEY >"

    skip_region_validation      = true
    skip_credentials_validation = true
  }
}

3. Init

Вы можете использовать все модули, которые есть в репозитории или закомментировать лишние, но учтите, что в первую очередь создается проект с сервисным пользователем, которые необходимы для провайдера Openstack.

Все, что будет создано ресурсами из провайдера Openstack должно идти после создания проекта и пользователя! Для этого потребуется добавить depends_on к ресурсу:

depends_on = [ module.project-with-user ]

Опционально: Создаем файл main.tf, где описана необходимая инфраструктура (пример ниже - создание Simple File Storage, остальные примеры смотри в папке modules):

module "sfs" {
  source               = "modules/sfs"
  os_network_id        = var.nat_network_id
  os_subnet_id         = var.nat_subnet_id
  sfs_size             = var.sfs_size
  sfs_volume_type      = var.sfs_volume_type
  os_availability_zone = var.os_availability_zone
}
  1. Инициализируем Terraform Backend командой:

обрати внимание на настройку стейт-файла выше

terraform init
  1. Для проверки вносимых изменений выполняем команду:
terraform plan
  1. Для применения изменений выполняем команду:
terraform apply

terraform apply -auto-approve - для применения без подтверждения

Пример использования

В репозитории можно найти пример использования модулей. В корне репозитория созданы *.tf файлы, которые можно использовать как пример вызова модулей.

Для их использования достаточно перейти в корень репозитория и инициализировать Terraform:

terraform init

Далее можно скорректировать некоторые параметры в файле main.tf, которые передаются в модули, например, объём SFS, имя кластера и другие.

Затем необходимо задать переменные, в которых будут содержаться данные от аккаунта Selectel, в котором будет развёрнута инфраструктура:

  • selectel_domain_name, ID аккаунта, например, 123123
  • selectel_user_admin_user, сервисный пользователь с нужными правами
  • selectel_user_admin_password, пароль от сервисного пользователя

Переменные можно задать несколькими способами:

  • В качестве переменных окружения (для этого нужно добавить перед названием переменной TF_VAR_):
export TF_VAR_selectel_domain_name=123123
export TF_VAR_selectel_user_admin_user=foo
export TF_VAR_selectel_user_admin_password=bar
terraform plan/apply
  • Ввести вместе с командой terraform plan/apply с помощью параметра -var:
terraform plan/apply \
-var="selectel_domain_name=123123" \
-var="selectel_user_admin_user=foo" \
-var="selectel_user_admin_password=bar"
  • Ввести с клавиатуры, если переменные не были заданы любым другим способом

После успешного выполнения команды terraform apply вы должны увидеть в своём аккаунте новый проект, в котором будут запущены все модули (MKS, SFS, vm, CRaaS и др.)

Структура репозитория

Репозиторий включает в себя минимально необходимую структура для запуска terraform. Самое интересное это папка moduels в которой собраны примеры запуска компонентов в облаке Selectel.

Modules