One of the first uses I’ll have for Terraform in my work will be adding resources to an existing environment – an environment for which Terraform has no state information. This means when I’m declaring the new VMs and want to tie it to a Resource Group, Terraform won’t have a matching resource for that.
Today I’ve been playing around with Terraform import in my sandbox to become familiar with the process. In my sandbox I have an existing Resource Group, Virtual Network, and Subnet. I intended to add a simple network interface, tied to an already-existing subnet.
To begin, I declared my existing resources in my .TF file as I would want them to exist (technically matching how they exist right now):
resource "azurerm_resource_group" "Client_1" { name = "Client_1" location = "${var.location}" } resource "azurerm_virtual_network" "Client1Network" { name = "Client1Network" address_space = ["10.1.0.0/16"] location = "${var.location}" resource_group_name = "${azurerm_resource_group.Client_1.name}" } resource "azurerm_subnet" "Web" { name = "Web" resource_group_name = "${azurerm_resource_group.Client_1.name}" virtual_network_name = "${azurerm_virtual_network.Client1Network.name}" address_prefix = "10.1.10.0/24" } |
Then for each of them I gathered the Resource ID in Azure. For the resource group and virtual network this was simple enough; find the Properties pane and copy the string that was there:
For the Subnet, there wasn’t an easy GUI reference that I could find, so I turned to Azure PowerShell, which output the ID I needed:
$vmnet = get-azurermVirtualnetwork | where {$_.Name -eq "Client1Network" } get-azurermvirtualnetworksubnetconfig -virtualnetwork $vmnet |
Then I used the Terraform “import” command along with the resource declaration and name in my file, and the resource ID from Azure:
terraform import azurerm_resource_group.Client_1 /subscriptions/f745d13d/resourceGroups/Client_1/providers/Microsoft.Network/virtualNetworks/Client1Network
I repeated the process for the resource group, virtual network, and subnet.
Then I added the resource declartaion in my .TF file for the network interface I wanted to add:
resource "azurerm_network_interface" "testNIC" { name = "testNIC" location = "${var.location}" resource_group_name = "${azurerm_resource_group.Client_1.name}" ip_configuration { name = "testconfiguration1" subnet_id = "${azurerm_subnet.Web.id}" private_ip_address_allocation = "dynamic" } } |
Then I performed a “terraform plan”, which showed me the resource it detected needing to be created:
Once I completed the “terraform apply”, the resource was created and visible within my Azure portal.