Terraform сообщает: «Ни один модуль не назван, имя модуля не объявлено» в корневом модуле

Я провел исследование и хочу придерживаться концепции настраиваемого модуля, а не использовать общедоступный реестр модулей Azure.

Расположение исходного кода здесь

https://github.com/ameyaagashe/help_me_cross_2

Я запускаю terraform в командной строке со следующими аргументами:

terraform plan -var "resource_group_name=nxt-grp-prd-manage-rgp-au-se" -var "virtual_network_name=virtual_network_1" -var "sql_subnet_name=subnet_1" -var "app_subnet_name=subnet_2" -var "application_nsg=test_nsg" -var "count_vm=2" -var "sql_host_basename=sqlvms" -var "app_host_basename=appvms" -var "storage_account_suffix=sta" -var "virtual_machine_size=Standard_B1ms" -var "virtual_machine_image_publisher=MicrosoftWindowsServer" -var "virtual_machine_image_offer=WindowsServer" -var "virtual_machine_image_sku=2012-R2-Datacenter" -var "virtual_machine_image_version=latest" -var "username=devopsadmin" -var "password=Angular12#$%"

Однако я получаю такие ошибки, как показано ниже:

Error: Reference to undeclared module

  on ../../modules/compute/main.tf line 25, in resource "azurerm_virtual_machine" "tf-vm":
  25:   location                         = module.resourcegroup.external_rg_location

No module call named "resourcegroup" is declared in sql_vms.


Error: Reference to undeclared module

  on ../../modules/compute/main.tf line 26, in resource "azurerm_virtual_machine" "tf-vm":
  26:   resource_group_name              = module.resourcegroup.external_rg_name

No module call named "resourcegroup" is declared in sql_vms.


Error: Reference to undeclared module

  on ../../modules/compute/main.tf line 27, in resource "azurerm_virtual_machine" "tf-vm":
  27:   network_interface_ids            = [element(module.network.network_interface_ids,count.index)]

No module call named "network" is declared in sql_vms.


Error: Reference to undeclared module

  on ../../modules/network/data.tf line 5, in data "azurerm_virtual_network" "tf-vn":
   5:   resource_group_name  = module.resource_groups.external_rg_name

No module call named "resource_groups" is declared in networking.


Error: Reference to undeclared module

  on ../../modules/nsg/main.tf line 3, in resource "azurerm_network_security_group" "tf-nsg":
   3:   location            = module.resourcegroup.external_rg_location

No module call named "resourcegroup" is declared in network_security_group.


Error: Reference to undeclared module

  on ../../modules/nsg/main.tf line 4, in resource "azurerm_network_security_group" "tf-nsg":
   4:   resource_group_name = module.resourcegroup.external_rg_name

No module call named "resourcegroup" is declared in network_security_group.


Error: Reference to undeclared input variable

  on ../../modules/resourcegroup/data.tf line 2, in data "azurerm_resource_group" "tf-rg-external":
   2:   name = var.rg_name

An input variable with the name "rg_name" has not been declared. This variable
can be declared with a variable "rg_name" {} block.

Невозможно понять основную проблему ...

Я определяю все модули в их собственных файлах конфигурации terraform и вызываю их в корневом модуле?

Я был бы искренне признателен за вашу помощь.




Ответы (1)


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

Ссылка на module.resource_group выходы изнутри module.sql_vms не будет работать, потому что композиция модулей Terraform не позволяет родственным модулям напрямую ссылаться на выходы друг от друга.

В документации есть раздел, объясняющий это:

Выходные данные могут передаваться из одного модуля в другой только через корневой модуль.

Вот пример из документации Terraform:

module "network" {
  source = "./modules/aws-network"

  base_cidr_block = "10.0.0.0/8"
}

module "consul_cluster" {
  source = "./modules/aws-consul-cluster"

  vpc_id     = module.network.vpc_id
  subnet_ids = module.network.subnet_ids
}

Как только это будет исправлено, следующая проблема заключается в том, что модули не ссылаются на их правильные имена. Согласно main.tf в репозитории git объявлено 4 модуля:

module.sql_vms
module.resource_group
module.networking
module.network_security_group

Поскольку модуль объявлен как resource_group, на него следует ссылаться как на таковой вместо resourcegroup.

Наконец, переменная с именем rg_name должна быть объявлена ​​внутри каталога modules/resourcegroup/. Чтобы узнать об объявлениях переменных, см. Следующее:

Возможно, это не все проблемы, но это начало. Если есть возможность, я настоятельно рекомендую прочитать документацию Terraform по созданию модулей. Их можно найти здесь:

person artburkart    schedule 02.12.2019
comment
Спасибо миллионному приятелю. Теперь понял это. - person learner; 04.12.2019
comment
Но затем речь идет о порядке развертывания модулей. - person Max Voitko; 02.06.2020