Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Terraform 如何跨工作空间/模块共享地形变量?_Terraform_Terraform Provider Azure_Terraform Cloud - Fatal编程技术网

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

Terraform云工作区允许我定义变量,但我无法找到跨多个工作区共享变量的方法

在我的示例中,我有两个工作区:

  • 数据库
  • 应用
在这两种情况下,我将使用相同的AzureRM凭据进行连接。以下是工作区用于连接到my 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个工作区)。 有办法做到这一点吗

或者正确的方法是将“数据库”和“应用程序”定义为一个模块,然后使用工作区(开发、质量保证、产品)来协调它们


在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
如果您使用Terraform Cloud本身在这个管理Terraform Cloud的工作区上运行操作(当然,您需要手动将这个设置为引导,而不是让它自行管理),那么您可以将
var.common\u environment\u variables
配置为该工作区上的敏感变量

如果您改为通过传递到
提供程序“azurerm”
块中的Terraform变量进行设置(如您在示例中所示),则您强制运行配置的任何人员或系统直接填充这些变量,强制他们使用服务主体而不是其他机制,并防止Terraform自动获取使用的凭据集。Terraform配置通常只应描述Terraform正在管理的内容,而不应描述与运行Terraform的人员或运行Terraform的位置相关的设置

请注意,Terraform云自我管理工作区的状态将包括
Terraform正在管理的对象的凭证副本是正常的,因此应适当设置以限制对其的访问。

我将无法将Enterprise用于我的项目,但这没关系。您对环境配置的补充是一个很好的补充,我只是在研究它,因为通过研究我知道这些配置不应该存在。