Crear Máquina Virtual en Azure (ARM) con un template a través de PowerShell y Json | PowerShell

Microsoft Azure, provee dos formas de implementar y administrar los servicios en la nube que componen nuestra aplicación, el modelo clásico (Service Management Modelo) y el nuevo modelo (Resource Management).

Ambos modelos no son totalmente compatibles entre sí, existen diferencias técnicas tanto a la hora de implementarlos como los mecanismos sobre los cuales están basados, donde el modelo clásico se basa en XML y el nuevo modelo en JSON.

Si bien podemos utilizar cualquiera de los dos, Microsoft recomienda realizar las implementaciones con el nuevo modelo.

Más información sobre sus diferencias pueden encontrarlas en los siguientes enlaces:

https://azure.microsoft.com/en-us/documentation/articles/resource-manager-deployment-model/

https://azure.microsoft.com/en-us/documentation/articles/resource-group-overview/

En esta oportunidad, les mostraré como realizar la creación de una máquina virtual con el nuevo modelo ARM (Azure Resource Mánager), utilizando un template en JSON y Azure Powershell 1.0.1

Con dicha plantilla crearemos:

  • La cuenta de almacenamiento.
  • La red virtual y subredes.
  • Nombre DNS de nuestra IP pública.
  • Máquina virtual Windows Server 2012 R2 con últimas actualizaciones.
  • Usuario administrador del servidor con su contraseña.
  • Toda la configuración de red del servidor.

A su vez creamos el grupo de recursos necesario para alojar esta implementación.

Lo primero que tenemos que hacer es instalar el módulo de Powershell de AzureRM.

Utilizando PowerShell 5.0, lo podremos descargar directamente desde la consola con los siguientes pasos:

Ejecutamos PowerShell como administrador.

Habilitamos la política de ejecución de scripts de forma irrestricta:

Set-ExecutionPolicy unrestricted

Luego instalamos el módulo con los siguientes comandos:

Install-Module AzureRM

Install-AzureRM

Import-AzureRM

https://msdn.microsoft.com/en-us/library/mt125356.aspx

Debemos tener en cuenta que se requiere salida a internet para la descarga.

Una vez que contamos con el módulo, ya podemos comenzar el despliegue.

Paso 1

Iniciamos sesión en nuestra subscripción de Azure a través de Powershell con los siguientes comandos:

Login-AzureRmAccount

Luego comprobamos que nos encontremos parados sobre las subscripción, en la cual queremos realizar el despliegue:

Get-AzureRmSubscription

Select-AzureRmSubscription -SubscriptionName "Visual Studio Premium con MSDN"

Por último buscamos la imagen del sistema operativo (SKU) que deseamos desplegar, a continuación les dejó un enlace con la tabla de imágenes más comunes:

https://azure.microsoft.com/en-us/documentation/articles/resource-groups-vm-searching/

Igualmente pueden buscar otras imágenes con los siguientes comandos:

Get-AzureRmVMImageSku -Location westus -PublisherName MicrosoftWindowsServer -Offer WindowsServer | Select-Object Skus

1

Para esta prueba utilizaremos: 2012-R2-Datacenter

Paso 2

Generamos el template en JSON, el mismo es una plantilla provista por Microsoft que pueden copiar de los artículos de MSDN o utilizar los publicados en GitHub.

{
"$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
    "newStorageAccountName": {
        "type": "string",
		 "metadata": {
            "Description": "Unique DNS Name for the Storage Account where the Virtual Machine's disks will be placed."
        }
    },
    "adminUsername": {
		"type": "string",
		"metadata": {
			   "Description": "Username for the Virtual Machine."
			}
    },
    "adminPassword": {
        "type": "securestring",
		"metadata": {
            "Description": "Password for the Virtual Machine."
        }
    },
    "dnsNameForPublicIP": {
        "type": "string",
		"metadata": {
            "Description": "Unique DNS Name for the Public IP used to access the Virtual Machine."
        }
    },
    "windowsOSVersion": {
        "type": "string",
        "defaultValue": "2012-R2-Datacenter",
		"metadata": {
            "Description": "The Windows version for the virtual machine."
		}
    }
},
"variables": {
    "location": "West US",
    "imagePublisher": "MicrosoftWindowsServer",
    "imageOffer": "WindowsServer",
    "OSDiskName": "osdiskforwindowssimple",
    "nicName": "LAN",
    "addressPrefix": "10.0.0.0/16",
    "subnetName": "NG-TEST-SUBNET",
    "subnetPrefix": "10.0.0.0/24",
    "storageAccountType": "Standard_LRS",
    "publicIPAddressName": "NG-PUBLIC-IP",
    "publicIPAddressType": "Dynamic",
    "vmStorageAccountContainerName": "vhds",
    "vmName": "NGTESTVM2012R2",
    "vmSize": "Standard_A3",
    "virtualNetworkName": "NG-TEST-VNET",
    "vnetID": "[resourceId('Microsoft.Network/virtualNetworks',variables('virtualNetworkName'))]",
    "subnetRef": "[concat(variables('vnetID'),'/subnets/',variables('subnetName'))]"
},
"resources": [
    {
        "type": "Microsoft.Storage/storageAccounts",
        "name": "[parameters('newStorageAccountName')]",
        "apiVersion": "2015-05-01-preview",
        "location": "[variables('location')]",
        "properties": {
            "accountType": "[variables('storageAccountType')]"
        }
    },
    {
        "apiVersion": "2015-05-01-preview",
        "type": "Microsoft.Network/publicIPAddresses",
        "name": "[variables('publicIPAddressName')]",
        "location": "[variables('location')]",
        "properties": {
            "publicIPAllocationMethod": "[variables('publicIPAddressType')]",
            "dnsSettings": {
                "domainNameLabel": "[parameters('dnsNameForPublicIP')]"
            }
        }
    },
    {
        "apiVersion": "2015-05-01-preview",
        "type": "Microsoft.Network/virtualNetworks",
        "name": "[variables('virtualNetworkName')]",
        "location": "[variables('location')]",
        "properties": {
            "addressSpace": {
                "addressPrefixes": [
                    "[variables('addressPrefix')]"
                ]
            },
            "subnets": [
                {
                    "name": "[variables('subnetName')]",
                    "properties": {
                        "addressPrefix": "[variables('subnetPrefix')]"
                    }
                }
            ]
        }
    },
    {
        "apiVersion": "2015-05-01-preview",
        "type": "Microsoft.Network/networkInterfaces",
        "name": "[variables('nicName')]",
        "location": "[variables('location')]",
        "dependsOn": [
            "[concat('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))]",
            "[concat('Microsoft.Network/virtualNetworks/', variables('virtualNetworkName'))]"
        ],
        "properties": {
            "ipConfigurations": [
                {
                    "name": "ipconfig1",
                    "properties": {
                        "privateIPAllocationMethod": "Dynamic",
                        "publicIPAddress": {
                            "id": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]"
                        },
                        "subnet": {
                            "id": "[variables('subnetRef')]"
                        }
                    }
                }
            ]
        }
    },
    {
        "apiVersion": "2015-05-01-preview",
        "type": "Microsoft.Compute/virtualMachines",
        "name": "[variables('vmName')]",
        "location": "[variables('location')]",
        "dependsOn": [
            "[concat('Microsoft.Storage/storageAccounts/', parameters('newStorageAccountName'))]",
            "[concat('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
        ],
        "properties": {
            "hardwareProfile": {
                "vmSize": "[variables('vmSize')]"
            },
            "osProfile": {
                "computername": "[variables('vmName')]",
                "adminUsername": "[parameters('adminUsername')]",
                "adminPassword": "[parameters('adminPassword')]"
            },
            "storageProfile": {
                "imageReference": {
                    "publisher": "[variables('imagePublisher')]",
                    "offer": "[variables('imageOffer')]",
                    "sku" : "[parameters('windowsOSVersion')]",
                    "version":"latest"
                },
               "osDisk" : {
                    "name": "osdisk",
                    "vhd": {
                        "uri": "[concat('http://',parameters('newStorageAccountName'),'.blob.core.windows.net/',variables('vmStorageAccountContainerName'),'/',variables('OSDiskName'),'.vhd')]"
                    },
                    "caching": "ReadWrite",
                    "createOption": "FromImage"
                }
            },
            "networkProfile": {
                "networkInterfaces": [
                    {
                        "id": "[resourceId('Microsoft.Network/networkInterfaces',variables('nicName'))]"
                    }
                ]
            }
        }
    }
]
}

Paso 3

Una vez creada la plantilla, realizamos el despliegue

Primero generamos las variables a utilizar y creamos el Resource Group:

$deployName = "NG-Example-Deploy"
$RGName = "NG-Test-RG-01"
$locName = "West Us"
$templatefile = "C:\temp\AzureRMTemplate.json"
$templateParameterFile = "AzureRMTemplate.param.dev.json"

New-AzureRmResourceGroup –Name $RGName –Location $locName

2

En mi caso, el template lo aloje en mi disco C: en la carpeta Temp.

Una vez generado, desplegamos el equipo:

New-AzureRmResourceGroupDeployment -Name $deployName -ResourceGroupName $RGName -TemplateFile $templatefile -TemplateParameterFile $templateParameterFile

Como se puede observar a continuación, ingresamos los parámetros solicitados por la consola y en forma automática comienza el despliegue:

3

Listo, si ingresamos a través del portal de administración podemos ver la máquina generada, con su correspondiente red, cuenta de almacenamiento, etc.

4.PNG

Conclusión

Utilizando los nuevos métodos de despliegue basados en plantillas JSON, nos ahorramos tiempo de código y construcción de scripts mejorando la automatización de los procesos de implementación.

Espero que les sea útil, saludos!!

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Blog at WordPress.com.

Up ↑

%d bloggers like this: