quickstarts/microsoft.compute/vmss-windows-customimage/scripts/deployScaleSet.ps1 (107 lines of code) (raw):
param(
[Parameter(Mandatory=$true)]
[string]$location,
[Parameter(Mandatory=$true)]
[string]$resourceGroupName,
[string]$customImageStorageAccountName='sdaviesarmne',
[string]$customImageContainer='images',
[string]$customImageBlobName='IISBase-osDisk.vhd',
[Parameter(Mandatory=$true)]
[string]$newStorageAccountName,
[Parameter(Mandatory=$true)]
[string]$newStorageAccountType,
[string]$newImageContainer='images',
[string]$newImageBlobName='IISBase-osDisk.vhd',
[string]$repoUri='https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.compute/vmss-windows-customimage/',
[string]$storageAccountTemplate='templates/storageaccount.json',
[Parameter(Mandatory=$true)]
[string]$scaleSetName,
[int]$scaleSetInstanceCount=2,
[Parameter(Mandatory=$true)]
[string]$scaleSetVMSize,
[Parameter(Mandatory=$true)]
[string]$scaleSetDNSPrefix,
[PSCredential]$scaleSetVMCredentials=(Get-Credential -Message 'Enter Credentials for new scale set VMs'),
[string]$scaleSetTemplate='azuredeploy.json'
)
function Switch-AzureResourceManagement
{
if ($switchMode)
{
Switch-AzureMode AzureResourceManager -WarningAction SilentlyContinue
}
}
function Switch-AzureServiceManagement
{
if ($switchMode)
{
Switch-AzureMode AzureServiceManagement -WarningAction SilentlyContinue
}
}
# Check that Azure Module is available
Import-Module -Name Azure
$azureModule=Get-Module -Name Azure
if ($azureModule)
{
if ($azureModule.Version.Major -eq 0)
{
$switchMode=$true
Switch-AzureResourceManagement
}
else
{
$switchMode=$false
# TODO - Deal with Azure PS v1
throw 'Azure PS v1 or greater not supported'
}
}
else
{
throw 'Azure Module not available'
}
try
{
# Create a new Resource Group
New-AzureResourceGroup -ResourceGroupName $resourceGroupName -Location $location -Force
# Test names for validity
$newStorageAccountName=$newStorageAccountName.ToLowerInvariant()
if (-not (Get-AzureStorageAccount -ResourceGroupName $resourceGroupName -Name $newStorageAccountName -ErrorAction SilentlyContinue))
{
if (Test-AzureName -Storage -Name $newStorageAccountName -ErrorAction Stop)
{
throw "Storage Account Name in use "
}
}
$scaleSetDNSPrefix=$scaleSetDNSPrefix.ToLowerInvariant()
if (-not (Get-AzurePublicIpAddress -ResourceGroupName $resourceGroupName|where Location -eq $location).DnsSettings.DomainNameLabel -eq $scaleSetDNSPrefix)
{
if (-not (Test-AzureDnsAvailability -DomainQualifiedName $scaleSetDNSPrefix -Location $location -ErrorAction Stop))
{
throw "Scale Set DNS Name in use "
}
}
# Create a new Storage Account for the image
$parameters=@{"location"="$location";"newStorageAccountName"="$newStorageAccountName";"storageAccountType"="$newStorageAccountType"}
$templateUri="$repoUri$storageAccountTemplate"
New-AzureResourceGroupDeployment -ResourceGroupName $resourceGroupName -TemplateUri $templateUri -TemplateParameterObject $parameters -Name 'createstorageaccount'
# Copy the blob from the source to the new storage account
$destkey=(Get-AzureStorageAccountKey -Name $newStorageAccountName -ResourceGroupName $resourceGroupName).Key1
Switch-AzureServiceManagement
$destcontext= New-AzureStorageContext -StorageAccountName $newStorageAccountName -StorageAccountKey $destkey -Protocol Https
$srccontext= New-AzureStorageContext -StorageAccountName $customImageStorageAccountName -Anonymous -Protocol Https
$destcontainer=Get-AzureStorageContainer -Context $destcontext -Name $newImageContainer -ErrorAction SilentlyContinue
if ($destcontainer -eq $null){
New-AzureStorageContainer -Context $destcontext -Name $newImageContainer
}
Get-AzureStorageBlob -Container $customImageContainer -Context $srccontext -Blob $customImageBlobName|Start-CopyAzureStorageBlob -DestContext $destContext -DestContainer $newImageContainer -DestBlob $newImageBlobName -ErrorVariable $copyerror -ErrorAction Continue|Get-AzureStorageBlobCopyState -WaitForComplete
# Deploy the scale set using the new custom image as the target
$sourceImageVhdUri=(Get-AzureStorageBlob -Container $newImageContainer -Context $destContext -Blob $newImageBlobName).ICloudBlob.StorageUri.PrimaryUri.AbsoluteUri
Switch-AzureResourceManagement
$parameters=@{"vmSSName"="$scaleSetName";"instanceCount"=$scaleSetInstanceCount;"vmSize"="$scaleSetVMSize";"dnsNamePrefix"="$scaleSetDNSPrefix";"adminUsername"=$scaleSetVMCredentials.UserName;"adminPassword"=$scaleSetVMCredentials.GetNetworkCredential().Password;"location"="$location";"sourceImageVhdUri"="$sourceImageVhdUri"}
$templateUri="$repoUri$scaleSetTemplate"
New-AzureResourceGroupDeployment -ResourceGroupName $resourceGroupName -TemplateUri $templateUri -TemplateParameterObject $parameters -Name 'createscaleset'
}
catch
{
Write-Error $_
}