这次来分享一下关于Azure的脚本,目前来讲在使用Azure的时候,新创建的一些资源基本上都已经在用ARM模式了,Azure classic portal现在也已经完全被new portal取代,在使用体验上来说ARM模式大部分情况下也被ASM更方便一些,但是也有一些细节的地方因为功能越来越强大,能支持的内容越来越多,有些时候平台本身提供的功能不一定能完全满足我们的需求,所以我们会自己写一些小脚本来尽量弥补

    

    今天要分享的内容很简单,在使用ARM模式创建虚拟机时,决定我们要创建什么操作系统的其实是三个参数,ImagePublisher,ImageOffer,ImageSku。这三者之间是嵌套的关系,imagesku包含在imageoffer里,imageoffer又包含在imagepublisher里


    可以直接通过Get-AzureRmVMImagePublisher看到各个区域提供VM image的publisher   如何使用PowerShell 收集Azure VM Image列表_Azure


    之后可以通过Get-AzureRmVMImageOffer,针对每个不同的publisher来看下他能提供哪些Offer,拿最常见的windows server举例

    如何使用PowerShell 收集Azure VM Image列表_Azure_02


    比如如果我想知道要创建server 2016的一台虚拟机,应该怎样指定参数,我们可以再通过Get-AzureRmVMImageSku来查看选定的offer里具体有哪些sku,sku也决定了我们最后创建的虚拟机的操作系统,比如可以看到2016也有很多不同的sku,server core或者是container等等

如何使用PowerShell 收集Azure VM Image列表_VM_03



    因此如果我们想创建一个最基础的server 2016的虚拟机,那么指定的参数就是

    Publisher : MicrosoftWindowsServer 

    Offer : WindowsServer

    Sku : 2016-Datacenter


    这样创建出来的就会是一个Windows Server 2016的虚拟机了


    但是这样其实不是很方便,因为实际上提供镜像的publisher是非常非常多的,尤其是在国际版里,在东亚地区提供image的publisher就有700多个,更别提下边的offer还有sku了。


    因此我们很需要一个列表告诉我们想创建一个虚拟机,对应的image应该如何填写,比如我要创建一个CentOS 7.2那么我的image参数要如何指定,想创建Ubuntu又要如何指定。


    这里分享一个小脚本,可以把Azure提供image信息导出成一个csv文件,这就可以方便我们查询了


    代码如下:


param (
	[parameter(Mandatory = $false)]
	$LocationName = "ChinaNorth",
	[parameter(Mandatory = $false)]
	$ExportTo = [Environment]::GetFolderPath("Desktop") + "\" + $LocationName + "-VMImage-" + $(Get-Date -Format "yyyyMMdd-HHmmss") + ".csv"
	
)


function Check-AzureRmLocation()
{
	param
	(
		[string]$LocationName = $(throw "Parameter missing: -LocationName LocationName")
	)
	Write-Host "$(Get-Date) * Checking location $LocationName" -ForegroundColor Cyan
	$Location = Get-AzureRmLocation | Where-Object { $_.Location -eq $LocationName }
	If (-not ($Location))
	{
		
		Write-Host "$(Get-Date) * The location" $LocationName "does not exist." -ForegroundColor Red
		return $false
	}
	Else
	{
		Write-Host "$(Get-Date) * Location $LocationName exists" -ForegroundColor Cyan
		return $true
	}
}


$LocationExist = Check-AzureRmLocation -LocationName $LocationName
if ($LocationExist -eq $true)
{
	write-host "$(Get-Date) * Begin to collect VM Image information..Please wait" -ForegroundColor 'Cyan'
	[pscustomobject[]]$VMImageObjects = $null
	if (Test-Path $ExportTo)
	{
		Clear-Content $ExportTo -Force
	}
	
	$Error.clear()
	
	try
	{
		
		$Publishers = (Get-AzureRmVMImagePublisher -Location $LocationName -ErrorAction Stop).PublisherName
		$TotalPublisherCounts = $Publishers.count
		$PublisherCount = 1
		foreach ($Publisher in $Publishers)
		{
			Write-Progress -Activity ("Current Publisher: $Publisher") -Status "Searching $PublisherCount Publisher, Total Publisher: $TotalPublisherCounts" -PercentComplete ($PublisherCount/ $TotalPublisherCounts * 100) -Id 1
			$Offers = (Get-AzureRmVMImageOffer -Location $LocationName -PublisherName $Publisher -ErrorAction Stop).offer
			$TotalOfferCounts = $Offers.count
			if ($TotalOfferCounts -eq 0)
			{
				$PublisherCount++
			}
			else
			{
				$OfferCount = 1
				foreach ($Offer in $Offers)
				{
					Write-Progress -Activity ("Current Offer: $Offer") -Status "Searching $OfferCount Offer, Total Offer: $TotalOfferCounts" -PercentComplete ($OfferCount/ $TotalOfferCounts * 100) -Id 2 -ParentId 1
					$Skus = Get-AzureRmVMImageSku -Location $LocationName -PublisherName $Publisher -Offer $Offer -ErrorAction Stop	
					$TotalSkuCounts = $Skus.count
					if ($TotalSkuCounts -eq 0)
					{
						$OfferCount++
					}
					else
					{	
						$SkuCount = 1	
						foreach ($Sku in $Skus)
						{
							$VMImageObject = New-Object -TypeName psobject
							$VMImageObject | Add-Member -MemberType NoteProperty -Name LocationName -Value $Sku.Location
							$VMImageObject | Add-Member -MemberType NoteProperty -Name PublisherName -Value $Sku.PublisherName
							$VMImageObject | Add-Member -MemberType NoteProperty -Name OfferName -Value $Sku.Offer
							$VMImageObject | Add-Member -MemberType NoteProperty -Name SkuName -Value $Sku.skus
							$VMImageObjects += $VMImageObject
							Write-Progress -Activity ("Current Sku: $($Sku.skus)") -Status "Searching $SkuCount Sku, Total Sku: $TotalSkuCounts" -PercentComplete ($SkuCount/ $TotalSkuCounts * 100) -id 3 -ParentId 2
							Start-Sleep -Milliseconds 500
							$SkuCount++
							
						}
						$OfferCount++
					}
				}
				$PublisherCount++
			}	
		}
		
		
		
		if ($VMImageObjects -ne $null)
		{
			$VMImageObjects | Export-Csv -LiteralPath $ExportTo -NoTypeInformation -Force -ErrorAction Stop
			Write-Host "$(Get-Date) * Export successfully, Please check $ExportTo" -ForegroundColor Cyan
		}
		else
		{
			Write-Host "$(Get-Date) * Something wrong" -ForegroundColor Red
			
		}
		
		
		
	}
	catch
	{
		Write-Warning $Error[0].Exception.Message
		
	}
	
	
}



   不是专业的码农,写的代码也不怎么专业哈~凑合着能用就行,因为这个脚本运行的时间会比较长,国际版的话可能需要半个小时以上,所以加了一些进度条来让用户对运行的进度有个了解。运行的状态差不多就是下边这样


    如何使用PowerShell 收集Azure VM Image列表_VM_04



    最后会在桌面上有个文件,这就是我们需要的image的列表了~

    想创建什么直接搜下就OK了~

    如何使用PowerShell 收集Azure VM Image列表_image_05