はい、可能です。モジュール パスを使用して親部分を抽出し、それを child1 パスに連結するだけです。
答え
親モジュール:
main.tf
module "parent" {
source = "s3::https://s3.amazonaws.com/tf-modules-zip/child1.zip" # <-- Calling the child1 module
some_variable = "foo" # <-- Assigning the foo value to some_variable
}
Child1 モジュール:
child1.tf
variable "some_variable" { # <-- Input variable
type = string
description = "Any value"
}
locals {
parent_module_name = path.module != "." ? regex(".*/([^/]+)?", path.module)[0] : "." ### <-- Extracting the parent module name from the current module path
path_to_yamls = "${path.module}/../${local.parent_module_name}.child1/src/yaml" ### <-- Concatenating the parent module name with the child2 module path
}
module "child1" {
source = "s3::https://s3.amazonaws.com/tf-modules-zip/child2.zip" # <-- Calling the child2 module
some_variable = var.some_variable # <-- Injecting the value of var.some_variable to the child2 module
path_to_yaml_files = local.path_to_yamls # <-- Injecting the value of local.path_to_yamls to the child2 module
}
Child2 モジュール:
child2.tf
variable "some_variable" { # <-- Input variable
type = string
description = "Any value"
}
variable "path_to_yaml_files" { # <-- Input variable
type = string
description = "Path to retrieve the yaml files"
}
locals {
path_to_configs = var.path_to_yaml_files # <-- Using the injected value in var.path_to_yaml_files from the child1 module
exclusions = yamldecode(file("${local.path_to_configs}/exclusions.yaml")) # <-- Using the injected value in var.path_to_yaml_files from the child1 module
}
resource "null_resource" "child2" {
local-exec {
interpreter = ["/bin/bash" ,"-c"],
command = <<-EOT
exec "command1 -yaml ${local.exclusions}" # <-- Using the injected value in var.path_to_yaml_files from the child1 module
exec "command2 -var ${var.some_variable}" # <-- Using the injected value in var.path_to_yaml_files from the child1 module
EOT
}
}
説明:
「terraform init」を実行すると、モジュールは次の構造の下の親パスにダウンロードされます。
-[example]
main.tf
|--[.terraform]
|--[modules]
|--[parent]
child1.tf
|--[parent.child1]
child2.tf
|--[src]
|--[yaml]
file1.yaml
file2.yaml
file3.yaml
「path.module」を使用してトリックを行います。呼び出されたモジュールからモジュール パスを取得します。この例では、「parent」という名前を持つ child1 から呼び出されています。次に、次の式: "${path.module}/../${local.parent_module_name}.child1/src/yaml" は、レベルを上げてから "parent.child1/値「parent」を持つ「${local.parent_module_name}」変数の補間後の src/yaml」ディレクトリ。
この方法の利点は、親モジュール名を main.tf ファイルで変更でき、「terraform init -upgrade」を実行した後に、ディレクトリ構造が新しい値を取ることです。
これが大いに役立つことを願っています!.