1

我正在 Azure 上建立一个基础设施,我选择的代码工具是 Terraform。

为了有一个很好的可维护代码,我决定使用模块。我当前的结构如下所示:

├── development/
│   ├── main.tf
│   ├── vars.tf
│   ├── outputs.tf
│  
├── modules/
│   ├── provider
│   └── resource-group
│   └── eventhub

因此,我什至将提供程序代码放入一个模块中。我的代码看起来像这样:

terraform {
  backend "azurerm" {}
}

module "provider" {
  tenant_id       = "${var.tenant_id}"
  client_id       = "${var.client_id}"
  client_secret   = "${var.client_secret}"
  subscription_id = "${var.subscription_id}"
  source          = "../modules/provider"
}

module "resource-group" {
  source = "../modules/resource-group"
}

module "iothub" {
  name     = "${module.resource-group.name}"
  location = "${module.resource-group.location}"
  source   = "../modules/iothub"
}

但是当我运行时,terraform apply我收到* provider.azurerm: Error validating provider: No valid (unexpired) Azure CLI Auth Tokens found. Please runaz login的错误消息.

我已经通过将代码从提供程序模块移动到main.tf我的开发环境的文件中来解决这个问题。但我很好奇为什么会发生这种情况。根模块中是否需要提供程序资源?

谢谢!

4

1 回答 1

1

无法向上传递提供程序配置,因此虽然可以在模块中定义提供程序,但您不能将该提供程序配置传递给父模块(包括根模块)或兄弟模块。

Terraform 自己的模块文档,您应该在根级别定义所有提供程序。

我个人通过为每个配置定义一个提供程序文件然后将其符号链接到每个适当的位置来实现这一点,这意味着我可以以更简单的方式更改配置,但也有其他方法。

请注意,您有时可能有充分的理由直接在资源中定义提供程序。我个人在我的 Postgresql RDS 模块中定义postgresql提供程序配置,该模块创建一个AWS RDS Postgresql 实例,然后使用 PostgreSQL 提供程序配置用户和数据库,连接到 RDS 实例在创建时公开的动态端点。

于 2018-11-06T14:17:29.500 回答