Reputation: 3
I have created two modules:
Network 2. VM In network.tf I have added network configuration thing for azure and in vm.tf I am trying to create a Virtual Machine. Calling both modules from main.tf I'm getting this error:
on ..\modules\vm\vm.tf line 20, in resource "azurerm_windows_virtual_machine" "myterraformvm": 20: network_interface_ids = [azurerm_network_interface.myterraformnic.id]
A managed resource "azurerm_network_interface" "myterraformnic" has not been declared in module.vm.
This is the code of vm.tf
# Resource Group
resource "azurerm_resource_group" "myterraformgroup" {
name = "myResourceGroup"
location = "eastus"
}
resource "azurerm_image" "example" {
# (resource arguments)
name = "WINDOWS2019C"
location = "eastus"
resource_group_name = azurerm_resource_group.myterraformgroup.name
}
# Virtual Machine Properties
resource "azurerm_windows_virtual_machine" "myterraformvm" {
name = "myVM"
location = "eastus"
resource_group_name = azurerm_resource_group.myterraformgroup.name
network_interface_ids = [azurerm_network_interface.myterraformnic.id]
size = "Standard_DS1_v2"
admin_username = "XXXXXXXXXXXXX"
admin_password = "XXXXXXXXXXXXXX"
os_disk {
name = "myOsDisk"
caching = "ReadWrite"
storage_account_type = "Premium_LRS"
}
source_image_id = "/subscriptions/XXXXXXXXXXXXXXXXXXX/soft.Compute/images/XXXXXXXX"
}
This is the code of network.tf
#Create virtual network
resource "azurerm_resource_group" "myterraformgroup" {
name = "myResourceGroup"
location = "eastus"
}
resource "azurerm_virtual_network" "myterraformnetwork" {
name = "myVnet"
address_space = ["10.0.0.0/16"]
location = "eastus"
resource_group_name = azurerm_resource_group.myterraformgroup.name
tags = {
environment = "Terraform Demo"
}
}
# Create subnet
resource "azurerm_subnet" "myterraformsubnet" {
name = "mySubnet"
resource_group_name = azurerm_resource_group.myterraformgroup.name
virtual_network_name = azurerm_virtual_network.myterraformnetwork.name
address_prefixes = ["10.0.1.0/24"]
}
# Create public IPs
resource "azurerm_public_ip" "myterraformpublicip" {
name = "myPublicIP"
location = "eastus"
resource_group_name = azurerm_resource_group.myterraformgroup.name
allocation_method = "Dynamic"
tags = {
environment = "Terraform Demo"
}
}
# Create Network Security Group and rule
resource "azurerm_network_security_group" "myterraformnsg" {
name = "myNetworkSecurityGroup"
location = "eastus"
resource_group_name = azurerm_resource_group.myterraformgroup.name
security_rule {
name = "HTTP"
priority = 1001
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "*"
source_address_prefix = "*"
destination_address_prefix = "*"
}
tags = {
environment = "Terraform Demo"
}
}
# Create network interface
resource "azurerm_network_interface" "myterraformnic" {
name = "myNIC"
location = "eastus"
resource_group_name = azurerm_resource_group.myterraformgroup.name
ip_configuration {
name = "myNicConfiguration"
subnet_id = azurerm_subnet.myterraformsubnet.id
private_ip_address_allocation = "Dynamic"
public_ip_address_id = azurerm_public_ip.myterraformpublicip.id
}
tags = {
environment = "Terraform Demo"
}
}
# Connect the security group to the network interface
resource "azurerm_network_interface_security_group_association" "example" {
network_interface_id = azurerm_network_interface.myterraformnic.id
network_security_group_id = azurerm_network_security_group.myterraformnsg.id
}
# Generate random text for a unique storage account name
resource "random_id" "randomId" {
keepers = {
# Generate a new ID only when a new resource group is defined
resource_group = azurerm_resource_group.myterraformgroup.name
}
byte_length = 8
}
main.tf
provider "azurerm" {
# The "feature" block is required for AzureRM provider 2.x.
# If you're using version 1.x, the "features" block is not allowed.
version = "~>2.0"
features {}
}
module "modules" {
source = "../modules/network"
}
module "vm" {
source = "../modules/vm"
}
Directory Structure:
$ ls
dev/ modules/
$ ls dev/
main.tf
$ ls modules/
network/ vm/
Upvotes: 0
Views: 2703
Reputation: 28204
Since you have defined the network interface resource in the module Network, you would like to call the network interface in another module VM. You need to declare the output values from the Network Module (the child module) to selectively export certain values to be accessed by the calling module.
In this case,
main.tf
module "network" {
source = "../modules/network"
}
module "vm" {
source = "../modules/vm"
vm_nic = module.network.nic
}
vm.tf
...
variable "vm_nic" {} # this variables.tf should be in the same directory as the vm.tf
...
resource "azurerm_windows_virtual_machine" "myterraformvm" {
name = "myVM"
location = "eastus"
resource_group_name = azurerm_resource_group.myterraformgroup.name
network_interface_ids = [var.vm_nic] # change this
network.tf
output "nic" {
value = azurerm_network_interface.myterraformnic.id
}
For more information, read https://www.terraform.io/docs/language/modules/syntax.html#calling-a-child-module
Upvotes: 2