我已经进行了探索,我想坚持使用自定义的模块概念,而不是使用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配置文件中定义所有模块,然后在根模块中调用它们?
衷心感谢您的协助。
答案 0 :(得分: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
}
此问题解决后,下一个问题是模块未被正确的名称引用。根据git repo中的main.tf
,已声明了4个模块:
module.sql_vms
module.resource_group
module.networking
module.network_security_group
由于该模块被声明为resource_group
,因此应引用该模块而不是resourcegroup
。
最后,应在rg_name
目录内声明一个名为modules/resourcegroup/
的变量。请查看以下内容以了解变量声明:
这可能不是所有问题,但这是一个开始。如果可能的话,我强烈建议您阅读有关创建模块的terraform文档。它们可以在这里找到: