-1

パスからテラフォームの親モジュール名を取得し、それを変数として他のモジュールに渡す必要があります。出来ますか?。例: モジュール child1 から、モジュール child2 内のディレクトリ src/yaml にアクセスできます。

親モジュール:

module "parent" {
  source = "s3::https://s3.amazonaws.com/tf-modules-zip/child1.zip"
  some_variable = "foo"
}

Child1 モジュール:

variable "some_variable" {
  type        = string
  description = "Any value"
}

locals {
  os_module_name = this.module.name
  path_to_yamls  = "${local.os_module_name}.child2/src/yaml"
}

module "child1" {
  source = "s3::https://s3.amazonaws.com/tf-modules-zip/child2.zip"
  some_variable = var.some_variable
  path_to_yaml_files = local.path_to_yamls
}

Child2 モジュール:

variable "some_variable" {
  type        = string
  description = "Any value"
}

variable "path_to_yaml_files" {
  type        = string
  description = "Path to retrieve the yaml files"
}

locals {
  path_to_configs = var.path_to_yaml_files
  exclusions    = yamldecode(file("${local.path_to_configs}/exclusions.yaml"))
}

resource "null_resource" "child2" {
  local-exec { 
    interpreter = ["/bin/bash" ,"-c"],
    command = <<-EOT
      exec "command1 -yaml ${local.exclusions}"
      exec "command2 -var ${var.some_variable}"
    EOT
  }
}
4

1 に答える 1

1

はい、可能です。モジュール パスを使用して親部分を抽出し、それを 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」を実行した後に、ディレクトリ構造が新しい値を取ることです。

これが大いに役立つことを願っています!.

于 2021-11-13T00:07:30.340 に答える