TL;DR в конце.
Я совершенно новичок в terragrunt, и я пытаюсь использовать его, чтобы воспользоваться функцией DRY (не повторяйтесь), которую он предлагает. Мое дерево показано ниже, я планирую использовать этот репозиторий для aws, gcp и azure, и в этом случае я сосредоточусь только на azure, как только я пойму, как использовать terragrunt, я смогу применить логику для других провайдеры. Мое дерево может быть одной из проблем, поэтому не стесняйтесь, дайте мне знать, если я сделал это неправильно.
Я хотел бы повторно использовать свой код, а не копировать одно и то же снова и снова. Сосредоточившись на Azure, конечная цель здесь — создать только группу ресурсов с хранилищем ключей Azure внутри нее, чтобы иметь возможность понять, как работает использование terragrunt.
Насколько я понимаю, создание tenant.hcl, subcription.hcl и env.hcl позволяет мне не менять это значение в моем коде.
Об остальном я, возможно, забыл некоторые зависимости в соответствии с моими сообщениями об ошибках... Я позиционирую себя в IaC/deployments/subscription-test-1/dev/client-test/ и выполняю «план terragrunt», но затем получаю некоторые сбои со следующими сообщениями об ошибках:
Сообщение об ошибке:
Система не может найти указанный путь. time=2023-03-30T09:26:00+02:00 level=error msg=Невозможно определить базовый код выхода, поэтому Terragrunt завершит работу с кодом ошибки 1
IaC/
├─ deployments/
│ ├─ azure/
│ │ ├─ subscription-test-1/
│ │ │ ├─ dev/
│ │ │ │ ├─ client-test/
│ │ │ │ │ ├─ terragrunt.hcl
│ │ │ │ ├─ env.hcl
│ │ │ ├─ ppd/
│ │ │ ├─ subscription.hcl
│ │ ├─ subscription-test-2/
│ │ │ ├─ dev/
│ │ │ ├─ ppd/
│ │ ├─ subscription-test-3/
│ │ │ ├─ prd/
│ │ │ ├─ sbx/
│ ├─ aws/
│ ├─ gcp/
│ ├─ tenant.hcl
├─ modules/
│ ├─ aws/
│ ├─ azuread/
│ │ ├─ security-groups/
│ │ ├─ spn/
│ ├─ azurerm/
│ │ ├─ akv/
│ │ │ ├─ main.tf
│ │ │ ├─ variables.tf
│ │ ├─ rg/
│ │ │ ├─ main.tf
│ │ │ ├─ variables.tf
│ ├─ databricks/
│ ├─ gcp/
├─ project-templates/
│ ├─ aws/
│ ├─ azure/
│ │ ├─ project-template-solution-1/
│ │ │ ├─ akv.tf
│ │ │ ├─ main.tf
│ │ │ ├─ rg.tf
│ │ │ ├─ variables.tf
│ │ │ ├─ terragrunt.hcl
│ │ ├─ project-template-solution-2/
│ │ ├─ project-template-solution-3/
│ ├─ gcp/
├─ terragrunt.hcl
Ниже приведен код террагранта и терраформа по папкам:
IaC/terragrunt.hcl
locals {
# Automatically load subscription variables
subscription_vars = read_terragrunt_config(find_in_parent_folders("subscription.hcl"))
# Automatically load tenant-level variables
tenant_var = read_terragrunt_config(find_in_parent_folders("tenant.hcl"))
# Automatically load environment-level variables
env_vars = read_terragrunt_config(find_in_parent_folders("env.hcl"))
environment = local.env_vars.locals.environment
subscription_id = local.subscription_vars.locals.subscription_id
}
IaC/modules/azurerm/akv/main.tf
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "3.42.0"
}
}
}
#Configure the Azure Resource Management Provider
provider "azurerm" {
subscription_id = var.azure_subscription_id
tenant_id = var.azure_tenant_id
features {
key_vault {
purge_soft_delete_on_destroy = true
recover_soft_deleted_key_vaults = true
}
}
}
#create azure key vault
resource "azurerm_key_vault" "akv" {
name = lower("${var.azure_project_code}-${var.azure_env_code}-akv-01")
location = var.azure_resource_group_location
resource_group_name = var.azure_rg_name
enabled_for_disk_encryption = true
tenant_id = var.azure_tenant_id
soft_delete_retention_days = 7
purge_protection_enabled = false
sku_name = "standard"
}
IaC/modules/azurerm/akv/variables.tf
variable "azure_subscription_id" {
type = string
description = "Azure Subscription Id"
}
variable "azure_tenant_id" {
type = string
description = "Azure Tenant Id"
}
variable "azure_rg_name" {
type = string
description = "Azure Resource Group Name"
}
variable "azure_resource_group_location" {
default = "west europe"
description = "Location of the resource group."
}
variable "azure_env_code" {
type = string
description = "Azure Environment Code"
}
variable "azure_project_code" {
type = string
description = "Azure Project Code"
}
IaC/modules/azurerm/rg/main.tf
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "3.42.0"
}
}
}
provider "azurerm" {
subscription_id = var.azure_subscription_id
tenant_id = var.azure_tenant_id
features {
resource_group {
prevent_deletion_if_contains_resources = false
}
}
}
#create azure resource group
resource "azurerm_resource_group" "rg" {
name = var.azure_rg_name
location = var.azure_resource_group_location
}
IaC/modules/azurerm/rg/variables.tf
variable "azure_subscription_id" {
type = string
description = "Azure Subscription Id"
}
variable "azure_tenant_id" {
type = string
description = "Azure Tenant Id"
}
variable "azure_rg_name" {
type = string
description = "Azure Resource Group Name"
}
variable "azure_resource_group_location" {
default = "west europe"
description = "Location of the resource group."
}
IaC/шаблон-проекта-решение-1/terragrunt.hcl
include {
path = find_in_parent_folders()
}
IaC/проект-шаблон-решение-1/akv.tf
module "akv" {
source = "../..//modules/azurerm/akv/"
azure_subscription_id = var.azure_subscription_id
azure_tenant_id = var.azure_tenant_id
azure_rg_name = var.azure_rg_name
azure_resource_group_location = var.azure_resource_group_location
azure_project_code = var.azure_project_code
azure_env_code = var.azure_env_code
}
IaC/проект-шаблон-решение-1/rg.tf
module "rg" {
source = "../..//modules/azurerm/rg/"
azure_subscription_id = var.azure_subscription_id
azure_tenant_id = var.azure_tenant_id
azure_rg_name = var.azure_rg_name
azure_resource_group_location = var.azure_resource_group_location
}
IaC/проект-шаблон-решение-1/main.tf
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "3.42.0"
}
}
}
provider "azurerm" {
subscription_id = var.azure_subscription_id
tenant_id = var.azure_tenant_id
features {
resource_group {
prevent_deletion_if_contains_resources = false
}
}
}
IaC/шаблон-проекта-решение-1/variables.tf
variable "azure_subscription_id" {
type = string
description = "Azure Subscription Id"
}
variable "azure_tenant_id" {
type = string
description = "Azure Tenant Id"
}
variable "azure_rg_name" {
type = string
description = "Azure Resource Group Name"
}
variable "azure_resource_group_location" {
default = "west europe"
description = "Location of the resource group."
}
variable "azure_env_code" {
type = string
description = "Azure Environment Code"
}
variable "azure_project_code" {
type = string
description = "Azure Project Code"
}
IaC/deployments/azure/tenant.hcl
locals {
tenant_id = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
IaC/deployments/azure/subscription-test-1/subscription.hcl
locals {
subscription_id = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
IaC/deployments/azure/subscription-test-1/dev/env.hcl
locals {
environment = "dev"
}
TL; DR: я пытаюсь развернуть архитектуру, смешивающую terraform и terragrunt, используя модули (папка модулей) и «модули вызова» (папка шаблонов проекта). Чтобы сначала развернуть с Azure группу ресурсов с хранилищем ключей Azure внутри нее.
Я пытался загрузить свой код на GitHub, но я впервые использую его, поэтому я мог допустить ошибки. Вы можете найти его здесь, если хотите загрузить его, отредактировать и отправить мне свои обновления. https://github.com/leanne-kami/IaC
Спасибо всем, кто найдет время, чтобы помочь мне :)
Да, я использовал двойную косую черту в соответствии с официальной документацией terragrunt, в которой указано (Примечание: двойная косая черта (//) в параметре источника является преднамеренной и обязательной. Это часть синтаксиса Terraform Git для источников модулей. Terraform может отображать «Terraform, инициализированный в пустой каталог», но вы можете спокойно его игнорировать.) Означает ли это, что я должен его использовать или нет? Меня смущает ваш комментарий.
Ну, вы используете git не как источник модуля, а путь к нему. В вашем примере модуль является локальным для того места, откуда он вызывается.
Я пытался, как вы сказали, безуспешно. Но спасибо, что нашли время, чтобы указать на это.
Друг помог мне решить проблему, выполнив два следующих шага:
Удаление блока зависимостей в IaC/deployments/azure/subscription-test-1/dev/client-test/terragrunt.hcl
Редактирование пути в IaC/project-templates/azure/project-template-solution-1/akv.tf и rg.tf, чтобы каталог понимал фактическое местоположение модуля. папки.
модуль "рг" { источник ="../..//модули/azurerm/rg/" azure_subscription_id = var.azure_subscription_id azure_tenant_id = var.azure_tenant_id azure_rg_name = var.azure_rg_name azure_resource_group_location = var.azure_resource_group_location }
Сообщение об ошибке не очень подробное, но я думаю, что у вас есть двойная косая черта в аргументах
source
иpaths
:"../../../../..**//**project-templates/azure/project-template-solution-1"
.