Рубрики
Uncategorized

Подход максимального модуля для обработки нескольких среда в терраформе

Обработка нескольких среда в терраформе может быть сложной задачей, и вы можете найти много подходов и … Tagged с облаком, Terraform, DevOps.

Работа с несколькими условиями в Terraform может быть сложной задачей, и вы можете найти много подходов и лучших практик в Интернете. Подход «максимальный модуль» является одним из них, используя только что встроенные концепции терраформы (в качестве альтернативы Terraform Workspaces с Terraform Cloud/Enterprise или с использованием инструментов обертки, таких как Terragrunt).

Но почему бы просто не использовать файлы «tfvars»? Потому что вы не можете использовать переменные в блоках бэкэнд и конфигурации поставщика.

Цели:

  • Иметь отдельные бэкэнды для удаленных самолетов в терраформе на окружающую среду
  • Иметь возможность использовать отдельные учетные записи систем для разных средств
  • Иметь возможность использовать разные версии поставщиков и самого терраформы на среду (и обновить один за другим)
  • Убедитесь, что все необходимые свойства предоставляются в соответствии с окружающей средой (Terraform Palidate не пройдет, если экологическая собственность отсутствует)
  • Убедитесь, что все ресурсы/модули всегда добавляются ко всем средам. Невозможно «забыть» о целом модуле.

Вот основная структура проекта Terraform с подходом максимального модуля, который сработал для меня и нескольких других команд:

- terraform_project
  - env
     - dev01        <-- Terraform home, run from here 
        - .terraform    <-- git ignored of course
        - dev01.tf  <-- backend, env config, includes always _only_ the main module
     - dev02
        - .terraform
        - dev02.tf 
     - stg01
        - .terraform
        - stg01.tf
     - prd01
        - .terraform
        - prd01.tf 
  - main        <-- main umbrella module
     - main.tf
     - variables.tf         
  - modules         <-- submodules of the main module
     - module_a
     - module_b
     - module_c

И настоящий пример-скриншот:

эн Каждый поддир Env — это терраформ «дом». Запустите Terraform Init/Plan/Примените в этих каталогах. Измените окружающую среду, изменив каталог. Это предотвращает ошибку объединения файлов состояний нескольких сред.

Образец dev01.tf Файл (часть):

provider "azurerm" {
  version = "~>1.42.0"
}

terraform {
  backend "azurerm" {
    resource_group_name  = "tradelens-host-rg"
    storage_account_name = "stterraformstate001"
    container_name       = "terraformstate"
    key                  = "dev.terraform.terraformstate"
  }
}

module "main" {
  source               = "../../main"
  subscription_id      = "000000000-0000-0000-0000-00000000000"
  project_name         = "tlens"
  environment_name     = "dev"
  resource_group_name  = "tradelens-main-dev"
  tenant_id            = "790fd69f-41a3-4b51-8a42-685767c7d8zz"
  location             = "West Europe"
  developers_object_id = "58968a05-dc52-4b69-a7df-ff99f01e12zz"
  terraform_sp_app_id  = "8afb2166-9168-4919-ba27-6f3f9dfad3ff"

  kubernetes_version      = "1.14.8"
  kuberenetes_vm_size     = "Standard_B2ms"
  kuberenetes_nodes_count = 4

  enable_ddos_protection = false
  enable_waf             = false
}

Это дает возможность настроить бэкэнд и поставщик на среду, а также предоставить все необходимые параметры для основного модуля (то есть среда)

главный

Это основной модуль, который является зонтичным модулем для всего проекта Terraform.

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

Чтобы реализовать различия между средами (уровни ценообразования и т. Д.) Используйте флаги и параметры.

переменные.tf Файл перечисляет необходимые параметры для среды. Специфичные для среды настройки.

Образец переменные.tf Файл (часть)

variable "subscription_id" {
  description = "Azure Subscription ID"
  type        = string
}

variable "project_name" {
  description = "Project name"
  type        = string
}

variable "environment_name" {
  description = "Environment name"
  type        = string
}

variable "resource_group_name" {
  description = "Target resource group name"
  type        = string
}

...

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

Любые общие удаленные ресурсы будут включены здесь.

Образец main.tf Файл (часть):

module "eventhub" {
  source              = "../modules/eventhub"
  environment_name    = var.environment_name
  resource_group_name = var.resource_group_name
  project_name        = var.project_name
}

module "dremio" {
  source                   = "../modules/dremio"
  environment_name         = var.environment_name
  resource_group_name      = var.resource_group_name
  project_name             = var.project_name
  linux_admin              = "dremio"
  linux_admin_password     = "1b4d7c79-a143-45e2-8ff1-ee63c0823090"
  dremio_data_name         = module.dremio_storage.dremio_data_name
  dremio_data_id           = module.dremio_storage.dremio_data_id
  dremio_data_disk_size_gb = module.dremio_storage.dremio_data_disk_size_gb
}

module "dremio_storage" {
  source              = "../modules/dremio-storage"
  resource_group_name = var.resource_group_name
  project_name        = var.project_name
}


module "datalake" {
  source              = "../modules/datalake"
  resource_group_name = var.resource_group_name
  project_name        = var.project_name
  environment_name    = var.environment_name
}

Этого должно быть достаточно, чтобы визуализировать концепцию.

Оригинал: «https://dev.to/piotrgwiazda/main-module-approach-for-handling-multiple-environments-in-terraform-1oln»