如何使用PowerShell 收集Azure VM Image列表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用PowerShell 收集Azure VM Image列表相关的知识,希望对你有一定的参考价值。
这次来分享一下关于Azure的脚本,目前来讲在使用Azure的时候,新创建的一些资源基本上都已经在用ARM模式了,Azure classic portal现在也已经完全被new portal取代,在使用体验上来说ARM模式大部分情况下也被ASM更方便一些,但是也有一些细节的地方因为功能越来越强大,能支持的内容越来越多,有些时候平台本身提供的功能不一定能完全满足我们的需求,所以我们会自己写一些小脚本来尽量弥补
今天要分享的内容很简单,在使用ARM模式创建虚拟机时,决定我们要创建什么操作系统的其实是三个参数,ImagePublisher,ImageOffer,ImageSku。这三者之间是嵌套的关系,imagesku包含在imageoffer里,imageoffer又包含在imagepublisher里
可以直接通过Get-AzureRmVMImagePublisher看到各个区域提供VM image的publisher
之后可以通过Get-AzureRmVMImageOffer,针对每个不同的publisher来看下他能提供哪些Offer,拿最常见的windows server举例
比如如果我想知道要创建server 2016的一台虚拟机,应该怎样指定参数,我们可以再通过Get-AzureRmVMImageSku来查看选定的offer里具体有哪些sku,sku也决定了我们最后创建的虚拟机的操作系统,比如可以看到2016也有很多不同的sku,server core或者是container等等
因此如果我们想创建一个最基础的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 } }
不是专业的码农,写的代码也不怎么专业哈~凑合着能用就行,因为这个脚本运行的时间会比较长,国际版的话可能需要半个小时以上,所以加了一些进度条来让用户对运行的进度有个了解。运行的状态差不多就是下边这样
最后会在桌面上有个文件,这就是我们需要的image的列表了~
想创建什么直接搜下就OK了~
以上是关于如何使用PowerShell 收集Azure VM Image列表的主要内容,如果未能解决你的问题,请参考以下文章
powershell 使用powershell创建用于测试SQL的Azure VM
使用 Azure PowerShell 同时停止多个 Azure VM