这次来分享一下关于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了~

转载于:https://blog.51cto.com/mxyit/2070613
本文介绍如何通过Azure的三个关键参数(ImagePublisher、ImageOffer、ImageSku)创建特定操作系统的虚拟机,并分享了一个实用脚本,用于导出可用镜像信息到CSV文件,便于查询。
254

被折叠的 条评论
为什么被折叠?



