我试图运行以下代码:
locals {
terraform_modules_git = "git::ssh://....@vs-ssh.visualstudio.com/v3/...../terraform-modules"
terraform_modules_module = "resource_group?ref=v15.0.0"
}
module "MyModuleCall" {
source = "${local.terraform_modules_git}/${local.terraform_modules_module}"
}我的目标是将所有标记引用合并到一个地方,而不是用回购的名称多次复制长字符串和所有模块。
我得到了一个错误:
Error: Variables not allowed
on main.tf line 12, in module "MyModuleCall":
12: source = "${local.terraform_modules_git}/${local.terraform_modules_module}"
Variables may not be used here.有谁知道他们为何要这样做呢?使用变量有什么问题?有人看到附近有工作吗?
发布于 2021-04-29 06:58:27
您无法动态生成source。您必须显式硬编码,正如文档中所解释的那样
此值必须是没有模板序列的文字字符串;不允许任意表达式。
遗憾的是,除了使用前处理模板之外,我不知道有什么解决办法。预处理只会找到并用您想要的替换source。
发布于 2021-04-29 18:56:02
Terraform中的依赖关系在执行程序之前是静态处理的,因为运行时需要访问所有涉及的代码(在Terraform的例子中,模块和提供程序),然后才能创建运行时上下文以执行任何代码。这与大多数其他编程语言相似,在运行主程序之前,通常使用单独的命令(如pip install、npm install或go get )安装依赖项。在Terraform的例子中,依赖安装程序是terraform init,而“运行程序”意味着运行terraform plan或terraform apply。
因此,Terraform不能也不允许动态构造模块或提供者源地址.如果您需要从调用模块中指定的地址中抽象模块的物理位置和访问方法,那么一种选择是使用模块注册表告诉Terraform如何将本地地址(如yourcompany.example.com/yourteam/resource-group/azure )映射到Terraform将实际用于获取它的更复杂的Git。
然而,在实践中,大多数团队更喜欢直接指定他们的Git URL,因为它导致了一个更简单的整体系统,尽管这样做的代价是以后更难将模块移动到一个新的位置。两者之间的一个折衷方案是使用一个提供Terraform服务的托管服务,例如Terraform,但这当然是以在整个系统中引入另一个可能的故障点为代价的。
https://stackoverflow.com/questions/67312304
复制相似问题