調査を行ったので、モジュールの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構成ファイルで定義し、それらをルートモジュールで呼び出していますか?
何卒よろしくお願い申し上げます。
それぞれの問題を個別に処理しても、長期的には役に立たない可能性があるため、問題の一般的な意味を提供し、将来のTerraform構成に役立つ参照を共有します。
Terraformモジュール構成では兄弟モジュールが相互の出力を直接参照できないため、module.resource_group
内からmodule.sql_vms
出力を参照することはできません。
それを説明するドキュメントのセクションがあります:
出力は、ルートモジュール経由でのみ、1つのモジュールから別のモジュールに渡すことができます。
以下は、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リポジトリのmain.tf
によると、4つのモジュールが宣言されています。
module.sql_vms
module.resource_group
module.networking
module.network_security_group
モジュールはresource_group
として宣言されているため、resourcegroup
ではなく、そのように参照する必要があります。
最後に、rg_name
という名前の変数をmodules/resourcegroup/
ディレクトリ内で宣言する必要があります。変数宣言については、以下を参照してください。
これはすべての問題ではないかもしれませんが、それは始まりです。可能であれば、モジュールの作成に関するTerraformドキュメントを一読することを強くお勧めします。それらはここにあります: