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.