Praveen sivadasan
Praveen sivadasan

Reputation: 175

How to get public IP of azure VM from the below terraform code

I have a terraform code which needs to retrieve public ip of a vm, here is my code

# Create virtual machine
resource "azurerm_virtual_machine" "myterraformvm" {
    name                  = "myTerraformVM"
    location              = "Central India"
    resource_group_name   = "rg-mpg-devops-poc"
    network_interface_ids = ["/subscriptions/*************/resourceGroups/rg-mpg-devops-poc/providers/Microsoft.Network/networkInterfaces/nic-mpg-devops"]
    vm_size               = "Standard_DS1_v2"

    storage_os_disk {
        name              = "myOsDisk"
        caching           = "ReadWrite"
        create_option     = "FromImage"
        managed_disk_type = "Premium_LRS"
    }

    os_profile {
        computer_name  = "myvm"
        admin_username = "azureuser"
    }

    os_profile_linux_config {
        disable_password_authentication = true
        ssh_keys {
            path     = "/home/azureuser/.ssh/authorized_keys"
            key_data = "ssh-rsa *********************"
        }}
     boot_diagnostics {
        enabled = "true"
        storage_uri = "https://*******.blob.core.windows.net/"
    }}

Here am using NIC id , which will provide public ip by default, Can some one help me on this?

Upvotes: 0

Views: 5670

Answers (2)

bwynns
bwynns

Reputation: 1

I tried this and could not retrieve the public IP. (more than likely pilot error.)

In my case I needed to retrieve an address for installing chef in a later step, so IP or FQDN would work. Here is how I got through this:

When creating my public ip, I added the domain label. Use this same value when you define your machine name.

resource "azurerm_public_ip" "CSpublicip" {
    name                         = "myPublicIP"
    location                     = "eastus"
    resource_group_name          = "${azurerm_resource_group.CSgroup.name}"
    allocation_method            = "Dynamic"
    domain_name_label            = "csvm${random_integer.server.result}"

When you add the domain label, Azure creates a reachable FQDN. Once you have that, you can use/retrieve the fqdn.

output "AzurePage" {
value = "${azurerm_public_ip.CSpublicip.fqdn}"

Upvotes: 0

4c74356b41
4c74356b41

Reputation: 72151

you would use data module for that:

data "azurerm_network_interface" "test" {
  name                = "acctest-nic"
  resource_group_name = "networking"
}

that will give you NIC object, that will have ip_configuration block, that (in turn) will have public_ip_address_id parameter and you will use that to get data for the public ip:

data "azurerm_public_ip" "test" {
  name                = "name_of_public_ip"
  resource_group_name = "name_of_resource_group"
}

output "domain_name_label" {
  value = "${data.azurerm_public_ip.test.domain_name_label}"
}

output "public_ip_address" {
  value = "${data.azurerm_public_ip.test.ip_address}"
}

you will have to parse resource ID into resource group\name of the resource obviously, but that can be easily done with split + array index

https://www.terraform.io/docs/providers/azurerm/d/public_ip.html
https://www.terraform.io/docs/providers/azurerm/d/network_interface.html

Upvotes: 5

Related Questions