如何在 workpaces/modules 之间共享 Terraform 变量?
How to share Terraform variables across workpaces/modules?
Terraform Cloud Workspaces 允许我定义变量,但我无法找到一种方法来跨多个工作区共享变量。
在我的示例中,假设有两个工作区:
- 数据库
- 申请
在这两种情况下,我将使用相同的 AzureRM 凭据进行连接。以下是工作区用于连接到我的 Azure 订阅的常用值:
provider "azurerm" {
subscription_id = "00000000-0000-0000-0000-000000000000"
client_id = "00000000-0000-0000-0000-000000000000"
client_secret = "00000000000000000000000000000000"
tenant_id = "00000000-0000-0000-0000-000000000000"
}
重复值没有意义(在我的例子中,我可能有 10 个工作区)。
有办法吗?
或者正确的做法是将"database"和"application"定义为一个Module,然后使用Workspaces(DEV、QA、PROD)来编排它们?
在 Terraform Cloud 中,Workspace 对象目前是您可以直接指定变量值的粒度最小的位置。没有在工作区之间共享变量值的内置机制。
但是,解决此问题的一种方法是使用 Terraform 本身来管理 Terraform Cloud。 The tfe
provider(由于历史原因以 Terraform Enterprise 命名,因为它是在 Terraform Cloud 推出之前构建的)将允许 Terraform 管理 Terraform Cloud 工作区及其相关变量。
variable "workspaces" {
type = set(string)
}
variable "common_environment_variables" {
type = map(string)
}
provider "tfe" {
hostname = "app.terraform.io" # Terraform Cloud
}
resource "tfe_workspace" "example" {
for_each = var.workspaces
organization = "your-organization-name"
name = each.key
}
resource "tfe_variable" "example" {
# We'll need one tfe_variable instance for each
# combination of workspace and environment variable,
# so this one has a more complicated for_each expression.
for_each = {
for pair in setproduct(var.workspaces, keys(var.common_environment_variables)) : "${pair[0]}/${pair[1]}" => {
workspace_name = pair[0]
workspace_id = tfe_workspace.example[pair[0]].id
name = pair[1]
value = var.common_environment_variables[pair[1]]
}
}
workspace_id = each.value.workspace_id
category = "env"
key = each.value.name
value = each.value.value
sensitive = true
}
通过上述配置,您可以将 var.workspaces
设置为包含您希望 Terraform 管理的工作空间的名称,并将 var.common_environment_variables
设置为您希望为所有工作空间设置的环境变量。
请注意,对于在提供者上设置凭据,推荐的方法是在环境变量而不是 Terraform 变量中设置它们,因为这样会使 Terraform 配置本身不知道如何获取这些凭据。您可以使用与 Azure CLI 身份验证的集成在本地(在 Terraform Cloud 之外)应用相同的 Terraform 配置,而 Terraform Cloud 执行环境通常会使用服务主体。
因此,要在 Terraform Cloud 环境中提供凭据,您需要将以下环境变量放入 var.common_environment_variables
:
ARM_CLIENT_ID
ARM_TENANT_ID
ARM_SUBSCRIPTION_ID
ARM_CLIENT_SECRET
如果您使用 Terraform Cloud 本身在这个管理 Terraform Cloud 的工作区上进行 运行 操作(当然,您需要手动将其设置为 bootstrap,而不是让它自己管理),那么您可以将 var.common_environment_variables
配置为该工作区上的敏感变量。
如果您改为通过传递到 provider "azurerm"
块的 Terraform 变量来设置它(如您在示例中所示),那么您会强制任何人或系统 运行 配置直接填充这些变量,迫使他们使用服务主体而不是其他机制之一,并阻止 Terraform 自动获取使用 az login
设置的凭据。 Terraform 配置通常只应描述 Terraform 管理的内容,而不是与 运行 正在使用 Terraform 或 Terraform 所在位置相关的设置 运行.
请注意,Terraform Cloud 自我管理工作区的状态将包括
这些凭据的副本对于 Terraform 正在管理的对象来说是正常的,因此应该适当地设置 the permissions on this workspace 以限制对其的访问。
您现在可以使用 variable sets 跨多个工作区重复使用变量
Terraform Cloud Workspaces 允许我定义变量,但我无法找到一种方法来跨多个工作区共享变量。
在我的示例中,假设有两个工作区:
- 数据库
- 申请
在这两种情况下,我将使用相同的 AzureRM 凭据进行连接。以下是工作区用于连接到我的 Azure 订阅的常用值:
provider "azurerm" {
subscription_id = "00000000-0000-0000-0000-000000000000"
client_id = "00000000-0000-0000-0000-000000000000"
client_secret = "00000000000000000000000000000000"
tenant_id = "00000000-0000-0000-0000-000000000000"
}
重复值没有意义(在我的例子中,我可能有 10 个工作区)。 有办法吗?
或者正确的做法是将"database"和"application"定义为一个Module,然后使用Workspaces(DEV、QA、PROD)来编排它们?
在 Terraform Cloud 中,Workspace 对象目前是您可以直接指定变量值的粒度最小的位置。没有在工作区之间共享变量值的内置机制。
但是,解决此问题的一种方法是使用 Terraform 本身来管理 Terraform Cloud。 The tfe
provider(由于历史原因以 Terraform Enterprise 命名,因为它是在 Terraform Cloud 推出之前构建的)将允许 Terraform 管理 Terraform Cloud 工作区及其相关变量。
variable "workspaces" {
type = set(string)
}
variable "common_environment_variables" {
type = map(string)
}
provider "tfe" {
hostname = "app.terraform.io" # Terraform Cloud
}
resource "tfe_workspace" "example" {
for_each = var.workspaces
organization = "your-organization-name"
name = each.key
}
resource "tfe_variable" "example" {
# We'll need one tfe_variable instance for each
# combination of workspace and environment variable,
# so this one has a more complicated for_each expression.
for_each = {
for pair in setproduct(var.workspaces, keys(var.common_environment_variables)) : "${pair[0]}/${pair[1]}" => {
workspace_name = pair[0]
workspace_id = tfe_workspace.example[pair[0]].id
name = pair[1]
value = var.common_environment_variables[pair[1]]
}
}
workspace_id = each.value.workspace_id
category = "env"
key = each.value.name
value = each.value.value
sensitive = true
}
通过上述配置,您可以将 var.workspaces
设置为包含您希望 Terraform 管理的工作空间的名称,并将 var.common_environment_variables
设置为您希望为所有工作空间设置的环境变量。
请注意,对于在提供者上设置凭据,推荐的方法是在环境变量而不是 Terraform 变量中设置它们,因为这样会使 Terraform 配置本身不知道如何获取这些凭据。您可以使用与 Azure CLI 身份验证的集成在本地(在 Terraform Cloud 之外)应用相同的 Terraform 配置,而 Terraform Cloud 执行环境通常会使用服务主体。
因此,要在 Terraform Cloud 环境中提供凭据,您需要将以下环境变量放入 var.common_environment_variables
:
ARM_CLIENT_ID
ARM_TENANT_ID
ARM_SUBSCRIPTION_ID
ARM_CLIENT_SECRET
如果您使用 Terraform Cloud 本身在这个管理 Terraform Cloud 的工作区上进行 运行 操作(当然,您需要手动将其设置为 bootstrap,而不是让它自己管理),那么您可以将 var.common_environment_variables
配置为该工作区上的敏感变量。
如果您改为通过传递到 provider "azurerm"
块的 Terraform 变量来设置它(如您在示例中所示),那么您会强制任何人或系统 运行 配置直接填充这些变量,迫使他们使用服务主体而不是其他机制之一,并阻止 Terraform 自动获取使用 az login
设置的凭据。 Terraform 配置通常只应描述 Terraform 管理的内容,而不是与 运行 正在使用 Terraform 或 Terraform 所在位置相关的设置 运行.
请注意,Terraform Cloud 自我管理工作区的状态将包括 这些凭据的副本对于 Terraform 正在管理的对象来说是正常的,因此应该适当地设置 the permissions on this workspace 以限制对其的访问。
您现在可以使用 variable sets 跨多个工作区重复使用变量