Menu

Azure Powershell (1): New-AzureRmDisk

Pues bien, llevaba tiempo sin escribir por aquí, así que manos a la obra para ponerse al día. El artículo de hoy irá sobre “Azure Powershell”, más en concreto de un comando que nos podría facilitar el trabajo con los recursos en Azure: “New-AzureRmDisk”; siendo esto en principio el comienzo de una serie de artículos sobre “Azure Powershell”.

Breve introducción

En la plataforma “Azure” podemos hacer uso de varios comandos (en la nomenclatura de Powershell "cmdlets") para trabajar con los recursos. Uno de ellos, “New-AzureRmDisk”, y en conjunto con otros, nos permitirá hacer copia(s) de disco(s) a una gran velocidad.

Proceso

De manera muy simple, hacemos uso de estas pocas líneas:
 
$DISK = Get-AzureRmDisk -ResourceGroupName $RESOURCE_GROUP ` -DiskName $DISK_NAME
$DISK_CONFIG = New-AzureRmDiskConfig -CreateOption Copy ` -Location $DISK.Location -SourceResourceId $DISK.Id
$MANAGED_DISK = New-AzureRmDisk -Disk $DISK_CONFIG ` -DiskName $NEW_DISK_NAME -ResourceGroupName $RESOURCE_GROUP

Lo que hacemos en la primera línea es obtener el disco en cuestión y guardamos toda su información en una variable; en la segunda establecemos una configuración de disco basada en la variable anterior, y por último en la tercera línea le decimos a “Powershell” que nos cree un disco con dicha configuración. Nota: la única limitación que tendremos es que el proceso requiere que el nuevo disco que creemos esté en el mismo “datacenter” que el original.

Ejemplos de implementaciones

Ya os podréis hacer una idea de la potencia de un comando así. En un determinado caso, un empresario podría pedirnos implementar una serie de máquinas en la plataforma, las cuales tendrían de base las mismas características: mismo sistema operativo, misma capacidad, misma estructura del sistema de ficheros, etc. El administrador podría empezar subiendo a “Azure” una copia del disco que tiene el empresario en su entorno local, y comenzar a aprovisionar las máquinas virtuales necesarias con un “script” así de sencillo pero a la vez potente:

# Some useful variables
$CREDENTIAL = Get-Credential
$SUBSCRIPTION_ID = '12345678-1234-5678-1234-123456789ABC'
$RESOURCE_GROUP = 'MY-RESOURCES'
$LOCATION = 'SOMEWHERE'
$DISK_NAME = 'OSDISK'
$SUBNET_NAME = 'MYSUBNET'
$SUBNET_PREFIX = 'xxx.xxx.xxx.xxx/xx'
$VNET_NAME = 'MYVNET'
$VNET_DIRECTION_SPACE = 'xxx.xxx.xxx.xxx/xx'
$VM_NAME = 'MYVM'
$VM_SIZE = 'MYVMSIZE'

# Log into Azure and selecting subscription
Login-AzureRmAccount -Credential $CREDENTIAL
Select-AzureRmSubscription -SubscriptionId $SUBSCRIPTION_ID

# Getting the disk and creating a configuration
$SRC_DISK = Get-AzureRmDisk -DiskName $DISK_NAME ` -ResourceGroupName $RESOURCE_GROUP
$DISK_CONFIG = New-AzureRmDiskConfig -CreateOption Copy ` -SourceResourceId $SRC_DISK.Id -Location $SRC_DISK.Location

# Here we create a new virtual network with new subnetwork
$SUBNET_CONFIG = New-AzureRmVirtualNetworkSubnetConfig ` -Name $SUBNET_NAME -AddressPrefix $SUBNET_PREFIX
$VNET = New-AzureRmVirtualNetwork -Name ($VNET_NAME + '-VNET') ` -Location $LOCATION -ResourceGroupName $NEW_RESOURCE_GROUP ` -AddressPrefix $VNET_DIRECTION_SPACE -Subnet $SUBNET_CONFIG

# The script requests number of VMs which we want to provision
$VM_QUANTITY = Read-Host "Number of VMs"

# Well, based on the previous request, let's begin for provisioning the VMs
for ($i=1; $i -le $VM_QUANTITY; $i++)
{
	# This is only to deal with a number of VMs greater than one digit.
	# With this, we set the resource's names including that number,
	# avoiding issues like setting "vmname_1..." instead of "vmname_01..."
	$NUMBER = $i
	if ($i.toString().length -eq 1)
	{
		$NUMBER = "0$i"
	}
	# Here we create the disk
	$DISK = New-AzureRmDisk -Disk $DISK_CONFIG -DiskName ($VM_NAME + "-$NUMBER" + '-OSDISK') 
	-ResourceGroupName $RESOURCE_GROUP
	$NIC = New-AzureRmNetworkInterface -Location $LOCATION -ResourceGroupName $RESOURCE_GROUP `
	-Name ($VM_NAME + "-$NUMBER" + '-NIC') -SubnetId $VNET.Subnets[0].Id
	# And finally, we create the VM
	$VM = New-AzureRmVMConfig -VMSize $VM_SIZE -VMName ($VM_NAME + "-$NUMBER" + '-VM')
	$VM = Add-AzureRmVMNetworkInterface -VM $VM -Id $NIC.Id
	$VM = Set-AzureRmVMOSDisk -VM $VM -ManagedDiskId $DISK.Id -CreateOption Attach -Windows
	New-AzureRmVM -ResourceGroupName $RESOURCE_GROUP -Location $LOCATION -VM $VM
}

En otro ejemplo podríamos copiar discos administrados entre suscripciones. Normalmente es un proceso que tardaría mucho, pero si las suscripciones con las que trabajamos están bajo el mismo “tenant” (el titular de la suscripción), podemos salvar mucho tiempo empleando el comando mencionado anteriormente. En este caso, el “script” no es menos entendible; en realidad, lo que hacemos es una nueva implementación aprovisionando la copia de los discos en la suscripción final, todo con un disco de datos extra:

# Some useful variables
$CREDENTIAL = Get-Credential
$OLD_SUBSCRIPTION_ID = '12345678-1234-5678-1234-123456789ABC'
$NEW_SUBSCRIPTION_ID = '87654321-8765-4321-4321-CBA987654321'
$OLD_RESOURCE_GROUP = ‘OLD-RESOURCES’
$NEW_RESOURCE_GROUP = 'NEW-RESOURCES'
$LOCATION = 'SOMEWHERE'
$MANAGED_DISK_NAME_1 = 'OSDISK'
$MANAGED_DISK_NAME_2 = 'DATADISK'
$SUBNET_NAME = 'MYSUBNET'
$SUBNET_PREFIX = 'xxx.xxx.xxx.xxx/xx'
$VNET_NAME = 'MYVNET'
$VNET_DIRECTION_SPACE = 'xxx.xxx.xxx.xxx/xx'
$VM_NAME = 'MYVM'
$VM_SIZE = 'MYVMSIZE'

# Log into Azure and selecting old subscription
Add-AzureRmAccount -Credential $CREDENTIAL
Select-AzureRmSubscription -SubscriptionId $OLD_SUBSCRIPTION_ID

# Get the source managed disk
$MANAGED_DISK_1 = Get-AzureRmDisk -DiskName $MANAGED_DISK_NAME_1 -ResourceGroupName $OLD_RESOURCE_GROUP $MANAGED_DISK_2 = Get-AzureRmDisk -DiskName $MANAGED_DISK_NAME_2 -ResourceGroupName $OLD_RESOURCE_GROUP

# Setup configuration for new disks
$DISK_CONFIG_1 = New-AzureRmDiskConfig -CreateOption Copy -SourceResourceId $MANAGED_DISK_1.Id `
-Location $MANAGED_DISK_1.Location
$DISK_CONFIG_2 = New-AzureRmDiskConfig -CreateOption Copy ` -SourceResourceId $MANAGED_DISK_2.Id `
-Location $MANAGED_DISK_2.Location

# New subscription and creating a new resource group
Select-AzureRmSubscription -SubscriptionId $NEW_SUBSCRIPTION_ID
New-AzureRmResourceGroup -Name $NEW_RESOURCE_GROUP -Location $LOCATION

# Create new managed disks on the target subscription
$DISK_1 = New-AzureRmDisk -DiskName $MANAGED_DISK_NAME_1 -ResourceGroupName $NEW_RESOURCE_GROUP 
-Disk $DISK_CONFIG_1
$DISK_2 = New-AzureRmDisk -DiskName $MANAGED_DISK_NAME_2 -ResourceGroupName $NEW_RESOURCE_GROUP 
-Disk $DISK_CONFIG_2

# Network configuration
$SUBNET_CONFIG = New-AzureRmVirtualNetworkSubnetConfig -AddressPrefix $SUBNET_PREFIX -Name $SUBNET_NAME 
$VNET = New-AzureRMVirtualNetwork -Name ($VNET_NAME + '-VNET') -Location $LOCATION `
-AddressPrefix $VNET_DIRECTION_SPACE -ResourceGroupName $NEW_RESOURCE_GROUP -Subnet $SUBNET_CONFIG
$PUBLIC_IP = New-AzureRmPublicIpAddress -Name ($VM_NAME + '-IP') -Location $LOCATION `
-ResourceGroupName $NEW_RESOURCE_GROUP -AllocationMethod Static
$NIC = New-AzureRmNetworkInterface -Name ($VM_NAME + '-NIC') -Location $LOCATION `
-ResourceGroupName $NEW_RESOURCE_GROUP -PublicIpAddressId $PUBLIC_IP.Id -SubnetId $VNET.Subnets[0].Id

# Create new VM
$VM = New-AzureRmVMConfig -VMName $VM_NAME -VMSize $VM_SIZE
$VM = Add-AzureRMVMNetworkInterface -VM $VM -Id $NIC.Id
$VM = Set-AzureRmVMOSDisk -VM $VM -ManagedDiskId $DISK_1.Id -CreateOption Attach -Windows
$VM = Add-AzureRmVMDataDisk -VM $VM -ManagedDiskId $DISK_2.Id -CreateOption Attach -Lun 0 `
-Name $MANAGED_DISK_NAME_2
New-AzureRmVM -ResourceGroupName $NEW_RESOURCE_GROUP ` -Location $LOCATION -VM $VM

Los casos de arriba son ejemplos que se nos podrían dar en nuestro día a día con “Azure”, pero no deberíamos estar exclusivamente limitados a ellos.

Si teníamos que copiar, por ejemplo, los “discos administrados” o “no administrados” entre suscripciones, debíamos usar una serie de comandos que, a grosso modo, descargaban en nuestro equipo las “instantáneas” de dichos discos, y luego volver a subirlos a la nueva suscripción en una cuenta de almacenamiento (convirtiéndolos en última instancia en “discos no administrados”), debiendo disponer de espacio de almacenamiento en nuestros equipos locales.

Pero con el comando comentado en este artículo, y tratándose de un recurso de Azure concreto (“discos administrados”), en vez de realizar todo ese proceso largo y costoso, podemos salvar tiempo y limitaciones. De hecho, se puede utilizar otro comando que explicaré en el siguiente “post” (llamado “ConvertTo-AzureRmVMManagedDisk”) para convertir en “discos administrados” los “no administrados” que muchos clientes tienen en sus suscripciones, y luego copiarlos con tranquilidad con “New-AzureRmDisk”.

Si necesitáis más información, se puede consultar en el siguiente enlace las ventajas que ofrecen los “discos administrados” sobre los “no administrados”. Está en inglés, pero también se puede consultar en castellano:

https://docs.microsoft.com/en-us/azure/virtual-machines/windows/managed-disks-overview


Y para una guía de preguntas y respuestas, podemos consultar también este otro enlace:

https://docs.microsoft.com/en-us/azure/virtual-machines/windows/faq-for-disks