Microsoft Azure IaaS: Creación de VMs y asignación de IPs internas (DIPs) desde PowerShell

Cuando necesitamos tener una creación estructurada de un conjunto de máquinas es interesante apoyarnos en PowerShell, ya que una vez establecidos los parámetros es un proceso mucho más rápido y personalizable que desde el portal.

Por otro lado, cuando trabajamos con Virtual Networks en Microsoft Azure, es importante saber que existe la posibilidad de asignar una IP específica a una máquina virtual, dentro del rango de IPs de la subnet elegida.

En este post voy a mostrar cómo es posible crear una máquina virtual desde Powershell y cómo configurar una IP estática interna para dicha máquina.

Creación de una máquina virtual desde PowerShell

Si bien es cierto que existen numerosos parámetros para la creación de una máquina, en este post voy a intentar simplificarlo a los mínimos necesarios para la creación. Hay que tener en cuenta de que debemos combinar varios comandos:

  1. New-AzureVMConfig: Crea un objeto de configuración de la VM, donde se indica el tamaño que debe tener la máquina, la imagen que se va a utilizar, el availability set, etcétera.
  2. Add-AzureProvisioningConfig: Una vez que se ha elegido el tipo de máquina, a través de la imagen, es necesario establecer algunos valores como el nombre de usuario, la contraseña, dominio, certificados, etcétera.
  3. New-AzureVM: Una vez completados los pasos anteriores ya es posible lanzar la creación de la máquina. A través de este comando confirmamos el nombre del cloud service a usar, affinity group o localización, etcétera.

Un ejemplo de creación de una máquina virtual small con Windows Server 2012 R2 Datacenter sería el siguiente:

$image = (Get-AzureVMImage | Where-Object {$_.Label -like "Windows Server 2012 R2 Datacenter, March 2014"}).ImageName
$adminUserName = "gis"
$pwd = "Passw0rd!"
$serviceName = "myfarmscv"
$affinitygroup = "Europe"
$vm = "mygisvm2"

New-AzureVMConfig -Name $vm -InstanceSize Small -ImageName $image  |
Add-AzureProvisioningConfig -windows -AdminUsername $adminUserName -Password $pwd |
New-AzureVM -ServiceName $serviceName -AffinityGroup $affinitygroup

En el apartado superior, he creado un conjunto de variables con los datos que necesito para la creación: el nombre de la imagen que quiero utilizar, nombre de usuario, contraseña, nombre del cloud service, el affinity group que quiero utilizar y el nombre de la máquina.

Si quisiéramos añadir la máquina a un cloud service que ya está creado bastaría con omitir el parámetro -AffinityGroup o -Location.

El segundo apartado es la ejecución de los tres comandos mencionados anteriormente concatenados entre sí. El resultado esperado de la operación debe ser similar al siguiente:

VM creation Powershell

Antes de la creación de máquinas a través de PowerShell, debemos asegurarnos de que tenemos una cuenta de storage por defecto asociada a la suscripción. Para ello, podemos lanzar el comando Get-AzureSubscription y comprobar el valor de CurrentStorageAccountName. Esta cuenta se utiliza por defecto para almacenar los vhds de las máquinas virtuales que creamos. De no definir ninguna cuenta, si intentamos crear una máquina nos devolverá un error. El siguiente comando nos permite establecer una por defecto:Set-AzureSubscription -SubscriptionName “mysuscriptionname” -CurrentStorageAccountName “mystorage”

Por otro lado, si quisiéramos indicar el storage a utilizar en cada creación, debemos utilizar el parámetro -MediaLocation a nivel del comando New-AzureVMConfig

Creación y asignación de IP

Otra de las configuraciones que podríamos añadir a la creación de una máquina virtual es la asociación a una red virtual y, además, la IP queremos que tenga la máquina dentro de la misma (desde el portal a día de hoy no es posible esta operación). Para ello, podemos ampliar el comando anterior con Set-AzureSubnet y Set-AzureStaticVNetIP, además de añadir, a través del comando New-AzureVM, la red virtual a la que debe pertenecer la máquina:

$image = (Get-AzureVMImage | Where-Object {$_.Label -like "Windows Server 2012 R2 Datacenter, March 2014"}).ImageName
$adminUserName = "gis"
$pwd = "Passw0rd!"
$serviceName = "myfarmscv"
$vm = "mygisvm2"
$vnet = "gis-network"
$subnet = "front-end"

New-AzureVMConfig -Name $vm -InstanceSize Small -ImageName $image |
Set-AzureSubnet -SubnetNames $subnet | Set-AzureStaticVNetIP -IPAddress 192.168.1.5 |
Add-AzureProvisioningConfig -Windows -AdminUsername $adminUserName -Password $pwd |
New-AzureVM -ServiceName $serviceName -VNetName $vnet

En el código anterior, he creado una VM dentro de un cloud service que ya existe y le he asignado una red virtual (gis-network), la subnet a la que debe pertenecer y qué IP quiero asignarle de manera explícita. Existe un comando que podemos utilizar para comprobar la disponibilidad de una IP dentro de una subnet:

Test-AzureStaticVNetIP -VNetName "gis-network" -IPAddress 192.168.1.5

Para más información sobre la configuración de IPs internas puedes consultar el siguiente enlace.

¡Saludos!