Terraform 如何跨工作空间/模块共享地形变量?
Terraform云工作区允许我定义变量,但我无法找到跨多个工作区共享变量的方法 在我的示例中,我有两个工作区:Terraform 如何跨工作空间/模块共享地形变量?,terraform,terraform-provider-azure,terraform-cloud,Terraform,Terraform Provider Azure,Terraform Cloud,Terraform云工作区允许我定义变量,但我无法找到跨多个工作区共享变量的方法 在我的示例中,我有两个工作区: 数据库 应用 在这两种情况下,我将使用相同的AzureRM凭据进行连接。以下是工作区用于连接到my Azure订阅的常用值: provider "azurerm" { subscription_id = "00000000-0000-0000-0000-000000000000" client_id = "00000000-0000-0000-0000-000
- 数据库
- 应用
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个工作区)。
有办法做到这一点吗
或者正确的方法是将“数据库”和“应用程序”定义为一个模块,然后使用工作区(开发、质量保证、产品)来协调它们
在Terraform Cloud中,工作空间对象是当前粒度最小的位置,您可以在其中直接指定变量值。没有在工作区之间共享变量值的内置机制 然而,实现这一点的一种方法是使用Terraform自身管理Terraform云。(由于历史原因,以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\u环境变量
设置为您希望为所有这些工作区设置的环境变量
请注意,对于在提供者上设置凭据,建议的方法是在环境变量而不是地形变量中设置凭据,因为这样一来,地形配置本身就不知道如何获取这些凭据。您可以使用与Azure CLI auth的集成在本地(Terraform Cloud之外)应用相同的Terraform配置,而Terraform Cloud执行环境通常会使用服务主体 因此,要在Terraform云环境中提供凭据,您需要将以下环境变量放入
var.common\u environment\u variables
:
ARM\u客户端\u ID
ARM\u租户\u ID
ARM\u订阅\u ID
ARM\u CLIENT\u SECRET
var.common\u environment\u variables
配置为该工作区上的敏感变量
如果您改为通过传递到提供程序“azurerm”
块中的Terraform变量进行设置(如您在示例中所示),则您强制运行配置的任何人员或系统直接填充这些变量,强制他们使用服务主体而不是其他机制,并防止Terraform自动获取使用的凭据集。Terraform配置通常只应描述Terraform正在管理的内容,而不应描述与运行Terraform的人员或运行Terraform的位置相关的设置
请注意,Terraform云自我管理工作区的状态将包括
Terraform正在管理的对象的凭证副本是正常的,因此应适当设置以限制对其的访问。我将无法将Enterprise用于我的项目,但这没关系。您对环境配置的补充是一个很好的补充,我只是在研究它,因为通过研究我知道这些配置不应该存在。