[terraform] remote-exec and print public_ip on Azure

133 views
Skip to first unread message

Walber Santos

unread,
Jul 26, 2019, 2:36:50 PM7/26/19
to terrafo...@googlegroups.com

Hi folks

I'm new in terraform and i would like a help with a issue.

I'm trying to make a deploy a linux vm(Ubuntu 18.04 LTS) on Azure and after vm its created, I would like to exec some commands,  like add a repository install ansible client... but no happens.

My terraform code

-----------------------------------------

variable "admin_username" {
    default = "some_user"
}

provider "azurerm" {
    subscription_id = "xxxxxxxxxxxx"
    tenant_id       = "xxxxxxxxxxxx"
}

# Create a resource group if it doesn’t exist
resource "azurerm_resource_group" "myterraformgroup" {
    name     = "myResourceGroup"
    location = "eastus"
}



# Create virtual network
resource "azurerm_virtual_network" "myterraformnetwork" {
    name                = "myVnet"
    address_space       = ["10.0.0.0/16"]
    location            = "eastus"
    resource_group_name = "${azurerm_resource_group.myterraformgroup.name}"
}

# 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_prefix       = "10.0.1.0/24"
}

# Create public IPs
resource "azurerm_public_ip" "publicip" {
    name                         = "myPublicIP"
    location                     = "eastus"
    resource_group_name          = "${azurerm_resource_group.myterraformgroup.name}"
    allocation_method            = "Dynamic"
}

# 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                       = "SSH"
        priority                   = 1001
        direction                  = "Inbound"
        access                     = "Allow"
        protocol                   = "Tcp"
        source_port_range          = "*"
        destination_port_range     = "22"
        source_address_prefix      = "*"
        destination_address_prefix = "*"
    }
}

# Create network interface
resource "azurerm_network_interface" "myterraformnic" {
    name                      = "myNIC"
    location                  = "eastus"
    resource_group_name       = "${azurerm_resource_group.myterraformgroup.name}"
    network_security_group_id = "${azurerm_network_security_group.myterraformnsg.id}"

    ip_configuration {
        name                          = "myNicConfiguration"
        subnet_id                     = "${azurerm_subnet.myterraformsubnet.id}"
        private_ip_address_allocation = "Dynamic"
        public_ip_address_id          = "${azurerm_public_ip.publicip.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
}

# Create storage account for boot diagnostics
resource "azurerm_storage_account" "mystorageaccount" {
    name                        = "diag${random_id.randomId.hex}"
    resource_group_name         = "${azurerm_resource_group.myterraformgroup.name}"
    location                    = "eastus"
    account_tier                = "Standard"
    account_replication_type    = "LRS"
}

# Create virtual machine
resource "azurerm_virtual_machine" "myterraformvm" {
    name                  = "myVM"
    location              = "eastus"
    resource_group_name   = "${azurerm_resource_group.myterraformgroup.name}"
    network_interface_ids = ["${azurerm_network_interface.myterraformnic.id}"]
    vm_size               = "Standard_DS1_v2"


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

    storage_image_reference {
        publisher = "Canonical"
        offer     = "UbuntuServer"
        sku       = "18.04-LTS"
        version   = "latest"
    }


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


    os_profile_linux_config {
        disable_password_authentication = true
        ssh_keys {
            path     = "/home/some_user/.ssh/authorized_keys"
            key_data = "ssh-rsa key-xxxxxx"
        }
    }

        provisioner "remote-exec" {
        connection {
            type = "ssh"
            host = "${azurerm_public_ip.publicip.ip_address}"
            user     = "${var.admin_username}"
        }

        inline = [
        "sudo apt install software-properties-common -y && sudo apt-add-repository ppa:ansible/ansible && sudo apt update && apt install ansible -y"
        ]
    }
    boot_diagnostics {
        enabled = "true"
        storage_uri = "${azurerm_storage_account.mystorageaccount.primary_blob_endpoint}"
    }
}

output "ip" {
    value = "${azurerm_public_ip.publicip.ip_address}"
}

--------------------------

Output

azurerm_resource_group.myterraformgroup: Creating...
azurerm_resource_group.myterraformgroup: Creation complete after 3s [id=/subscriptions/ff03ad4a-a974-4385-a0ad-2d3c3e3af154/resourceGroups/myResourceGroup]
azurerm_virtual_network.myterraformnetwork: Creating...
azurerm_public_ip.publicip: Creating...
azurerm_public_ip.publicip: Creation complete after 5s [id=/subscriptions/ff03ad4a-a974-4385-a0ad-2d3c3e3af154/resourceGroups/myResourceGroup/providers/Microsoft.Network/publicIPAddresses/myPublicIP]
azurerm_virtual_network.myterraformnetwork: Still creating... [10s elapsed]
azurerm_virtual_network.myterraformnetwork: Creation complete after 15s [id=/subscriptions/ff03ad4a-a974-4385-a0ad-2d3c3e3af154/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myVnet]
azurerm_subnet.myterraformsubnet: Creating...
azurerm_subnet.myterraformsubnet: Creation complete after 2s [id=/subscriptions/ff03ad4a-a974-4385-a0ad-2d3c3e3af154/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myVnet/subnets/mySubnet]
azurerm_network_interface.myterraformnic: Creating...
azurerm_network_interface.myterraformnic: Creation complete after 3s [id=/subscriptions/ff03ad4a-a974-4385-a0ad-2d3c3e3af154/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/myNIC]
azurerm_virtual_machine.myterraformvm: Creating...
azurerm_virtual_machine.myterraformvm: Still creating... [10s elapsed]
azurerm_virtual_machine.myterraformvm: Still creating... [20s elapsed]
azurerm_virtual_machine.myterraformvm: Still creating... [30s elapsed]
azurerm_virtual_machine.myterraformvm: Creation complete after 35s [id=/subscriptions/ff03ad4a-a974-4385-a0ad-2d3c3e3af154/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM]

Apply complete! Resources: 6 added, 0 changed, 0 destroyed.

Here I trying get the public_ip but come empty

Outputs:

ip =


All the best

Walber

Walber Santos

unread,
Jul 31, 2019, 7:03:50 AM7/31/19
to terrafo...@googlegroups.com
Hi folks

I figured out how to perform this.

I used the null resource calling the ip_address and work.

Walber



Reply all
Reply to author
Forward
0 new messages