GithubHelp home page GithubHelp logo

azure-terrafy-walkthrough's Introduction

Importing resources with Azure Terrafy

Public GitHub repo hosting Azure Terrafy - https://github.com/Azure/aztfy

Authors

Useful Links

Azure-terrafy-walkthrough

Welcome to the Azure Terrafy guide for importing your existing Azure infrastructure under Terraform management. The installation steps in this guide focus on a Windows deployment, but the import steps are consistent across all environments (MacOS,Unix,Linux,BSD)

Deployment Steps

Dependencies

Instructions

  1. Download and install prerequisites
  2. Configure Terraform \ Azure Terrafy (Extract Terraform executable to "c:\terraform", extract Azure Terrafy to "c:\aztfy")
    • To add the Terraform\ Azure Terrafy executable directory's to your PATH variable:

      • Click on the Start menu and search for Settings. Open the Settings app.
      • Select the System icon, then on the left menu, select the About tab. Under Related settings on the right, select Advanced system settings.
      • On the System Properties window, select Environment Variables.
      • Select the PATH variable, then click Edit.
      • Click the New button, then type in the path where the Terraform & Terrafy executable is located.
  3. Clone this git repo to your local machine
git clone https://github.com/kevinevans1/azure-terrafy-walkthrough

The following steps are completed from the CLI (Windows Terminal)

Authenticate to Azure

We need to authenticate to Azure in order for Terrafy to read our target subscriptions \ resource groups

Azure Subscription Configuration:

Azure CLI

1. az login (login)
2. set azure subscription reference "az account set --subscription <my sub>"

Azure Terrafy

Create a new directory for the tool to use a working directory. example:

 - mkdir aztfy_netrunner_demo
 - cd aztfy_netrunner_demo (This selects our newly created Azure Terrafy working directory)

Terraform Demo Plan Config Example

See below an example terraform state list that was outputted from the demo terraform configuration files included in this repo. We will use the below state list to verify our imported Azure configuration into Terraform state using Azure Terrafy.

Run "terraform state list" in your working directory after a successful "Terraform apply" to your Azure environment. This will output a similar resource list below for cross-reference.
 azurerm_network_interface.vm_nic
 azurerm_network_security_group.vm_subnet_nsg
 azurerm_resource_group.vm_resource_group
 azurerm_subnet.vm_subnet
 azurerm_subnet_network_security_group_association.vm_subnet_nsg_association
 azurerm_virtual_network.vm_vnet
 azurerm_windows_virtual_machine.vm_01

Lets Run Azure Terrafy:

In our working directory run the following command:

aztfy "your Azure external resource group name"

Azure Terrafy

Accept the defaults, in this example which included all of the resources.

Exception: You will see that res-1, will be detected as a unknown resource by the aztfy tool. In this instance amend the line with the resource type deployed.In this instance this would be "azurerm_windows_virtual_machine"

Azure Terrafy

The import process will begin as depicted here:

Azure Terrafy

Once the process is complete you will be greeted with a similar message's below:

Azure Terrafy

Azure Terrafy
 Terraform state and the config are generated at: C:\Users\KevinEvans\win-local-dev\aztfy_netrunner_demo

Imported Terraform working directory configuration:

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          18/04/2022    18:35                .terraform
-a---          18/04/2022    18:39           1071 .aztfyResourceMapping.json
-a---          18/04/2022    18:35           1108 .terraform.lock.hcl
-a---          18/04/2022    18:39           1983 main.tf
-a---          18/04/2022    18:35            181 provider.tf
-a---          18/04/2022    18:39          10208 terraform.tfstate
-a---          18/04/2022    18:39           9291 terraform.tfstate.backup

The provider.tf file contains the Terraform block and provider block:

terraform {
  backend "local" {}
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "3.0.2"
    }
  }
}

provider "azurerm" {
  features {}
}

The main.tf file contains definitions for 7 different resources which make up the demo VM deployment:

resource "azurerm_network_security_rule" "res-3" {
  access                      = "Allow"
  destination_address_prefix  = "*"
  destination_port_range      = "*"
  direction                   = "Inbound"
  name                        = "rdp"
  network_security_group_name = "acceptanceTestSecurityGroup1"
  priority                    = 100
  protocol                    = "Tcp"
  resource_group_name         = "vm-resources"
  source_address_prefix       = "*"
  source_port_range           = "*"
  depends_on = [
    azurerm_network_security_group.res-0,
  ]
}
resource "azurerm_virtual_network" "res-4" {
  address_space       = ["10.0.0.0/16"]
  location            = "westeurope"
  name                = "iaas-network"
  resource_group_name = "vm-resources"
  depends_on = [
    azurerm_network_security_group.res-0,
  ]
}
resource "azurerm_subnet" "res-5" {
  name                 = "internal"
  resource_group_name  = "vm-resources"
  virtual_network_name = "iaas-network"
  depends_on = [
    azurerm_virtual_network.res-4,
    azurerm_network_security_group.res-0,
  ]
}
resource "azurerm_resource_group" "res-6" {
  location = "westeurope"
  name     = "vm-resources"
}
resource "azurerm_network_security_group" "res-0" {
  location            = "westeurope"
  name                = "acceptanceTestSecurityGroup1"
  resource_group_name = "vm-resources"
  tags = {
    environment = "Production"
  }
  depends_on = [
    azurerm_resource_group.res-6,
  ]
}
resource "azurerm_windows_virtual_machine" "res-1" {
  admin_password        = null # sensitive
  admin_username        = "adminuser"
  custom_data           = null # sensitive
  location              = "westeurope"
  name                  = "vm-01"
  network_interface_ids = ["/subscriptions/resourceGroups/vm-resources/providers/Microsoft.Network/networkInterfaces/vm01-nic"]
  resource_group_name   = "vm-resources"
  size                  = "Standard_F2"
  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }
  source_image_reference {
    offer     = "WindowsServer"
    publisher = "MicrosoftWindowsServer"
    sku       = "2019-Datacenter"
    version   = "latest"
  }
  depends_on = [
    azurerm_network_interface.res-2,
  ]
}
resource "azurerm_network_interface" "res-2" {
  location            = "westeurope"
  name                = "vm01-nic"
  resource_group_name = "vm-resources"
  ip_configuration {
    name                          = "internal"
    private_ip_address_allocation = "Dynamic"
    subnet_id                     = "/subscriptions/resourceGroups/vm-resources/providers/Microsoft.Network/virtualNetworks/iaas-network/subnets/internal"
  }
  depends_on = [
    azurerm_subnet.res-5,
  ]
}

Terraform plan seal test:

lets run a terraform plan on our recently imported terraform configuration (vm-resources) to verify the import was a success, hopefully you will be greeted by the below message. Don't forget to run terraform init and terraform plan against imported resource group working directory.

No changes. Your infrastructure matches the configuration.

Thanks for taking time to read this Azure Terrafy guide for Windows.

azure-terrafy-walkthrough's People

Contributors

kevinevans1 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

azure-terrafy-walkthrough's Issues

Azure-Terrafy skipping a lot of resources during the import

Hi Kevin,

I tried the Azure-terrafy tool and found that it skips a lot of resources. There were around 443 resources in my resource group and majority of them were skipped by this tool. Around 60 odd resources were imported in the terraform configuration file. What is the reason that it skipped resources like Private Endpoint, Storage Accounts etc...

Is there a fix for such issues.

Regards,
Sujith

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.