#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
orpath.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
}
}