Перейти к содержанию

3.3 Terragrunt

Преимущества

  • Он позволяет повторно использовать конфигурационные параметры и поддерживает многоуровневые конфигурации и зависимости
  • Расширяет возможности терраформа
  • Следует принципу DRY (Don't Repeat Yourself)

Пример

locals {
  servers = {
    "master" = {
      memory         = 4
      cores          = 2
      zone           = "ru-central1-a"
      boot_disk_size = 20
      boot_disk_type = "network-ssd"
    }
    "slave" = {
      memory         = 4
      cores          = 2
      zone           = "ru-central1-a"
      boot_disk_size = 20
      boot_disk_type = "network-ssd"
    }
  }
  s3_access_key = get_env("AWS_ACCESS_KEY_ID")
  s3_secret_key = get_env("AWS_SECRET_ACCESS_KEY")
  s3_bucket     = "otus-tfstate"
  s3_region     = "ru-central1"

  yc_token = get_env("YC_TOKEN")
  yc_cloud_id  = "b1ga9aooiodscmmouobm"
  yc_folder_dev_id = "b1g416evp4dl2eef88nt"
  yc_folder_test_id = "b1gms5goflgecu065agg"
  yc_zone      = "ru-central1-a"

}

generate "provider" {
  path      = "provider_gen.tf"
  if_exists = "overwrite"
  contents  = <<EOF
provider "yandex" {
  token     = "${local.yc_token}"
  cloud_id  = "${local.yc_cloud_id}"
  folder_id = "${local.yc_folder_dev_id}"
  zone      = "${local.yc_zone}"
}
provider "yandex" {
  alias     = "test"
  token     = "${local.yc_token}"
  cloud_id  = "${local.yc_cloud_id}"
  folder_id = "${local.yc_folder_test_id}"
  zone      = "${local.yc_zone}"
}
EOF
}

generate "backend" {
  path      = "backend_gen.tf"
  if_exists = "overwrite"
  contents  = <<EOF
terraform {
  backend "s3" {
    endpoint                    = "storage.yandexcloud.net"
    bucket                      = "${local.s3_bucket}"
    region                      = "${local.s3_region}"
    key                         = "${path_relative_to_include()}/terraform.tfstate"
    access_key                  = "${local.s3_access_key}"
    secret_key                  = "${local.s3_secret_key}"
    dynamodb_endpoint           = "${local.dynamodb_endpoint}"
    dynamodb_table              = "tfstate"

    skip_region_validation      = true
    skip_credentials_validation = true
  }
}
EOF
}
terraform {
  source = "../../../terraform/modules/yandex"
}

include "root" {
  path = find_in_parent_folders()
  expose = true
}

dependency "vpc" {
  config_path = "../vpc"
  mock_outputs = {
    vpc_id = "dummy_vpc"
  }

  mock_outputs_allowed_terraform_commands = ["init", "validate", "plan"]
}

inputs = {
  servers      = include.root.locals.servers
  vpc_id       = dependency.vpc.outputs.vpc_id
  cidr_blocks  = ["10.51.21.0/24"]
  network_name = "test_network"
}