3.3 Terragrunt Преимущества Он позволяет повторно использовать конфигурационные параметры и поддерживает многоуровневые конфигурации и зависимости Расширяет возможности терраформа Следует принципу DRY (Don't Repeat Yourself) Пример terraform.hcl yandex/terragrunt.hcl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71locals { 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 } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24terraform { 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" }