Terraform - 从子模块访问根模块脚本

Posted

技术标签:

【中文标题】Terraform - 从子模块访问根模块脚本【英文标题】:Terraform - access root module script from child module 【发布时间】:2021-03-16 23:29:14 【问题描述】:

我有一个 ROOT_MODULEmain.tf:

#Root Module - Just run the script
resource "null_resource" "example" 
  provisioner "local_exec" 
    command = "./script.sh"

script.sh:

echo "Hello world

现在我在其他地方有另一个目录,我在其中创建了一个 CHILD_MODULE 和另一个main.tf

#Child Module
module "ROOT_MODULE" 
  source = "gitlabURL/ROOT_MODULE"

我已经导出了我的计划文件:terraform plan -out="planfile" 但是,当我对计划文件执行 terraform apply 时,我当前所在的目录不再知道 script.sh 的位置。我需要将脚本保存在与根模块相同的目录中。该脚本也在 gitlab 存储库中,因此我没有本地路径来调用它。 关于如何将此脚本放入我的子模块/从我的计划文件中执行它的任何想法?

Error running command './script.sh': exit status 1. Output: cannot access 'script.sh': No such file or directory

【问题讨论】:

【参考方案1】:

您可以访问根模块配置的路径以保留具有path.root 内在文件的路径:

provisioner "local_exec" 
  command = "$path.root/script.sh"

但是,根据您的问题,您似乎已经交换了根模块和子模块的术语。因此,该模块似乎真的是您的子模块而不是根模块,您需要使用 path.module 内在访问路径:

provisioner "local_exec" 
  command = "$path.module/script.sh"

然后无论您当前的工作目录如何,都会保留脚本的路径。

这些内在表达式记录在 here。

【讨论】:

同意这是答案,但你能找到最近的文档吗?因为我只能找到 0.11 版本的文档。 @9bO3av5fw5 它们确实已从文档中显式消失,但仍隐式存在。正在更新答案。 我认为这是您正在寻找的文档:terraform.io/docs/configuration/expressions/… @MartinAtkins 现在我们必须在下次有人寻找隐藏文档时对您进行 ping 操作。

以上是关于Terraform - 从子模块访问根模块脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何从子模块导入python脚本?

使用 Terraform 模块创建资源,其中一些资源由模块共享

如何将数据源从一个模块引用到另一个模块并将其作为变量传递给根模块?

从子文件夹导入模块

当代码移动到模块时,Terraform 正在破坏 AWS 资源

Terraform EC2 NIC private_ips 来自自定义模块输出的构建列表