У меня есть структура каталогов terraform, как показано ниже:
terraform/
main.tf modules outputs.tf provider.tf variables.tf
./modules:
compute network resourcegroup
./modules/compute:
main.tf outputs.tf variables.tf
./modules/network:
main.tf outputs.tf variables.tf
./modules/resourcegroup:
main.tf outputs.tf variables.tf
Файлы конфигурации модуля resourcegroup, как показано ниже:
Цель: в этом модуле я ссылаюсь на существующую группу ресурсов, которую я хотел бы использовать для создания виртуальной машины и связанных с ней объектов.
main.tf
data "azurerm_resource_group" "tf-rg-external" {
name = var.rg_name
}
variables.tf
variable "rg_name" {
type = string
}
сетевой модуль
Цель: я хотел бы использовать группу ресурсов из модуля группы ресурсов для ссылки в этом модуле. Таким образом, я определяю в одном месте и использую его в корневом и других модулях, например, в вычислениях, службе приложений, аках и т. Д.
main.tf
# Reference existing Virtual Network
data "azurerm_virtual_network" "tf-vn" {
name = var.vnet_name
resource_group_name = module.resource_groups.external_rg_name
}
# Reference existing subnet
data "azurerm_subnet" "tf-sn" {
name = var.subnet_name
virtual_network_name = data.azurerm_virtual_network.tf-vn.name
resource_group_name = module.resource_groups.external_rg_name
}
variables.tf
# Declare env variable
variable "vnet_name" {
type = string
}
variable "subnet_name" {
type = string
}
вычислить модуль.
Цель: определить все атрибуты для вычислений (ВМ). Идея в том, что корневой модуль будет использовать этот модуль для раскрутки различных ролей виртуальных машин.
main.tf
module "vm_iis" {
source = "Azure/compute/azurerm"
location = data.resourcegroup.tf-rg-external.location
vnet_subnet_id = data.network.tf-sn.id
admin_password = var.admin_password
data_sa_type = var.data_sa_type
delete_os_disk_on_termination = var.delete_os_disk_on_termination
nb_instances = var.nb_instances
nb_public_ip = var.nb_public_ip
public_ip_address_allocation = var.public_ip_address_allocation
resource_group_name = data.resourcegroup.tf-rg-external.name
.
.
.
}
variables.tf
variable "admin_password" {
type = string
}
variable "admin_username" {
type = string
}
variable "boot_diagnostics" {
type = bool
}
variable "boot_diagnostics_sa_type" {
type = string
}...
Корневой модуль terraform.
Цель: здесь должны использоваться модули, определенные для создания различных виртуальных машин разных размеров и имен хостов.
main.tf:
module "sql_vm" {
source = "./modules/compute/"
#location = data.resourcegroup.tf-rg-external.location
#vnet_subnet_id = data.network.tf-sn.id
public_ip_address_allocation = var.public_ip_address_allocation
#resource_group_name = data.resourcegroup.tf-rg-external.name
storage_account_type = var.storage_account_type
vm_hostname = var.vm_hostname
}
variables.tf: объявляет все переменные в файле main.tf.
Примечание. Я намеренно жестко закодировал переменные в основном файле / файле переменных корневого модуля. Это просто правильная связь между модулями. Правильный подход к пониманию и использованию модулей.
Однако, когда я запускаю terraform plan в корневом модуле. Я получаю сообщение об ошибке ниже:
Error: Reference to undeclared resource
on modules/compute/main.tf line 3, in module "vm_iis":
3: location = data.resourcegroup.tf-rg-external.location
A data resource "resourcegroup" "tf-rg-external" has not been declared in
sql_vm.
Error: Reference to undeclared resource
on modules/compute/main.tf line 4, in module "vm_iis":
4: vnet_subnet_id = data.network.tf-sn.id
A data resource "network" "tf-sn" has not been declared in sql_vm.
Error: Reference to undeclared resource
on modules/compute/main.tf line 22, in module "vm_iis":
22: resource_group_name = data.resourcegroup.tf-rg-external.name
A data resource "resourcegroup" "tf-rg-external" has not been declared in
sql_vm.
В чем проблема и как ее решить?
Кроме того, можно ли создавать разные (роли) виртуальные машины каким-либо циклом? пример sql-vm, iis-vm, testvm, abcvm? Что изменится, так это их имена хостов и размеры виртуальных машин.
==========
Опубликовать изменения ответа
==========
Я обновил значения для подсети, группы ресурсов и местоположения в compute / main.tf и terraform / main.tf, как показано ниже:
location = module.resourcegroup.tf-rg-external-location
vnet_subnet_id = module.network.subnet-id
resource_group_name = module.resourcegroup.tf-rg-external-name
Мой файл outputs.tf в модулях resourcegroup и network выглядит следующим образом:
outputs.tf модуля network
output "subnet-id" {
value = "data.network.tf-sn.id"
}
outputs.tf модуля resourcegroup
output "tf-rg-external-location" {
value = data.resourcegroup.tf-rg-external.location
}
output "tf-rg-external-name" {
value = data.resourcegroup.tf-rg-external.name
}
К сожалению, я все еще получаю такие ошибки, как показано ниже
Error: Unsupported argument
on main.tf line 3, in module "sql_vm":
3: location = module.resourcegroup.tf-rg-external-location
An argument named "location" is not expected here.
Error: Unsupported argument
on main.tf line 4, in module "sql_vm":
4: vnet_subnet_id = module.network.subnet-id
An argument named "vnet_subnet_id" is not expected here.
Error: Unsupported argument
on main.tf line 5, in module "sql_vm":
5: resource_group_name = module.resourcegroup.tf-rg-external-name
An argument named "resource_group_name" is not expected here.
Итак, похоже, мы не должны ссылаться на них в корневом модуле?
Кроме того, где их переменные должны быть определены, как в файле root modules variables.tf, поскольку я считаю, что вы можете переопределить значения для переменной модулей в корневом модуле?
Простите меня, если я веду себя глупо. Я пытаюсь понять, как это работает в реальной жизни.
После последнего коммита и публичного репо ошибки указаны ниже
Error: Reference to undeclared module
on main.tf line 3, in module "sql_vm":
3: location = module.resourcegroup.tf-rg-external-location
No module call named "resourcegroup" is declared in the root module.
Error: Reference to undeclared module
on main.tf line 4, in module "sql_vm":
4: vnet_subnet_id = module.network.subnet-id
No module call named "network" is declared in the root module.
Error: Reference to undeclared module
on main.tf line 5, in module "sql_vm":
5: resource_group_name = module.resourcegroup.tf-rg-external-name
No module call named "resourcegroup" is declared in the root module.
Error: Reference to undeclared module
on modules/compute/main.tf line 3, in module "vm_iis":
3: location = module.resourcegroup.tf-rg-external-location
No module call named "resourcegroup" is declared in sql_vm.
Error: Reference to undeclared module
on modules/compute/main.tf line 4, in module "vm_iis":
4: vnet_subnet_id = module.network.subnet-id
No module call named "network" is declared in sql_vm.
Error: Reference to undeclared module
on modules/compute/main.tf line 5, in module "vm_iis":
5: resource_group_name = module.resourcegroup.tf-rg-external-name
No module call named "resourcegroup" is declared in sql_vm.
Error: Reference to undeclared module
on modules/network/main.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 test2.
Error: Reference to undeclared resource
on modules/resourcegroup/outputs.tf line 2, in output "tf-rg-external-location":
2: value = data.resourcegroup.tf-rg-external.location
A data resource "resourcegroup" "tf-rg-external" has not been declared in
test1.
Error: Reference to undeclared resource
on modules/resourcegroup/outputs.tf line 5, in output "tf-rg-external-name":
5: value = data.resourcegroup.tf-rg-external.name
A data resource "resourcegroup" "tf-rg-external" has not been declared in
test1.