Как получить имя вызывающего модуля в Terraform

#terraform

#terraform

Вопрос:

Как я могу получить доступ к имени родительского / вызывающего модуля из его дочернего модуля.
В качестве альтернативы, как я могу получить имя файла вызывающего модуля из его дочернего модуля?

например

 module "test_parent_module" {
    source = "./child_module"
}
 
 module "child_module" {
    locals {
        // What could I use here to get parent module name?
        parent_module_name = module.parent # Should output "test_parent_module"
        // What could I use here to get the parent module's file name?
        parent_file_name = module.parent.filename # Should output "test_parent_module.tf"
    }

}
 

Спасибо

Комментарии:

1. Нет никакого способа получить вызывающий модуль во время выполнения. Вы можете получить путь, по которому запускается Terraform, используя path.cwd or path.root , но это вам не поможет, если у вас есть вложенные модули и вам нужен только родительский, а не корневой модуль. Могу ли я спросить, чего вы пытаетесь достичь с помощью этого? Вместо этого может быть лучший способ сделать это.

2. В настоящее время это невозможно, но, безусловно, было бы полезно. Он также существует в Puppet ( caller_module_name ) , который является действительно похожим DSL с действительно похожей функциональностью для того, что называется «модулем». Только сегодня утром я снова подумал о том, чтобы ввести запрос функции для этого.

3. В моем случае идея состоит в том, чтобы использовать имена файлов конфигурации декларативным способом. Таким образом, конечный пользователь может просто правильно задать имена файлов, и я могу автоматически использовать это для настройки модуля.

4. Это намеренно невозможно в Terraform, потому что было бы удивительно, если бы поведение модуля изменилось только потому, что вызывающий выбрал для него другое имя. Имя модуля является закрытым для вызывающего модуля, и ничто за пределами этого вызывающего модуля не должно знать или заботиться об этом.

5. Если модулю требуется какое-то пространство имен или префикс для использования, чтобы гарантировать, что он может генерировать уникальные имена в удаленной системе, тогда он должен объявить отдельную входную переменную для этого префикса и указать в документации, в каком пространстве имен этот префикс должен быть уникальным, поскольку удаленные системы будут иметь другое определениеболее «уникальный», чем Terraform.

Ответ №1:

Вы не можете. Этот тип иерархии наследования не работает для terraform. Я бы рекомендовал вместо этого передавать переменные. (Хотя кажется, что в вашей конфигурации есть другие проблемы, если вы полагаетесь на имя файла terraform, поэтому вы можете пересмотреть свои структуры кода)

 module "test_A_module" {} // what you had as parent
 
 module "test_B_module" {
    source = "./child_module"

    module_name = "test_A_module"
    file_name = "test_A_module.tf"
}
 
 module "child_module" {
    locals {
        module_name = var.module_name
        file_name = var.file_name
    }

}