我正在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 run
az登录.
的错误消息
我已经通过将代码从提供程序模块移到我的开发环境的main.tf
文件中来解决此问题。但是我很好奇为什么会首先发生这种情况。根模块中是否需要提供程序资源?
谢谢!
答案 0 :(得分:1)
不可能向上传递提供程序配置,因此尽管可以在模块中定义提供程序,但您不能再将该提供程序配置传递给父级(包括根目录)或兄弟模块。
Terraform自己的module documentation,您应该在根级别定义所有提供程序。
我个人通过为每个配置定义一个提供程序文件,然后将其符号链接到每个适当的位置来实现此目的,这意味着我可以以更简单的方式更改配置,但是还有其他方法。
请注意,有时您可能有充分的理由直接在资源中定义提供程序。我在自己的Postgresql RDS模块中定义了postgresql
provider配置,该配置创建了AWS RDS Postgresql instance,然后使用PostgreSQL提供程序配置了用户和数据库,并连接到RDS实例在创建时公开的动态端点。