如何使用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了~

原文地址:http://blog.51cto.com/mxyit/2070613

时间: 2025-01-17 17:08:59

如何使用PowerShell 收集Azure VM Image列表的相关文章

使用PowerShell 删除Azure VM

看到标题估计很多人会觉得这玩意也要写个博客,能不能再水点 哈哈哈,当然没这么简单,不过也不会太难,这回要介绍的确实是如何删除Azure中的虚拟机,删除虚拟机本身是个简单的不能再简单的任务 直接在Portal上鼠标点一下不就删掉了,这是绝对没错的.but,因为Azure的计算和存储是分离的,删除虚拟机其实只是删除了Azure的计算能力,本身Azure的OS磁盘,数据磁盘,网卡这些都还会保留在Azure环境中 这样做的好处是显而易见的,可以避免你的数据因为VM删除而丢失,生产环境删除VM之后也建议要

使用Azure Monitor从Azure VM收集数据

相信大家都知道,在我们日常运维的过程中,对系统的监控是必不可少的.通过监控我们能够了解到系统资源的使用状况如网络吞吐量,磁盘使用率以及系统的某些服务是否处于running状态,以便于在适当的时候采取相应的措施.那今天我们就来看一下如何使用Azure Monitor从Azure虚拟机收集logs和metrics数据.若要使用Azure Monitor收集在Azure中运行的虚拟机的性能和日志数据,我么可以对其安装Log Analytics Agent,通过Log Analytics Agent将A

PowerShell批量配置Azure VM端点

我们可以通过PowerShell命令:Add-AzureEndpoint来向虚拟机添加端点. 请参考以下脚本,批量添加虚拟机端点: 备注:该例子针对一个虚拟机,添加了三个端口: 端口名称 协议 公用端口 私有端口 MyPort1 tcp 5001 5001 MyPort2 tcp 5002 5002 MyPort3 udp 5003 5003 该例子中,云服务名称与虚拟机名称均为:JohnsonLinux.如果需要添加更多的端口,那么可以按照相应格式,将端口配置添加到$newVmEndpoint

通过PowerShell命令给Azure VM添加CustomScriptExtension

Azure的VM提供了一种管理工具叫Azure VM Extension.它实现了一些管理虚拟机所需要的重要功能,比如:重设密码.设置RDP参数.以及许多其他关键的功能,并且Azure VM一直在添加新的Extension.默认情况下,创建的Windows VM会安装以下几个基本的VM Extension,包括IaaSDiagnostics,VMAccess和BGInfo.Linux的VM,如果开启Diagnostics功能,默认会安装LinuxDiagnostic的Extension. 通过A

PowerShell批量启动/关闭Azure VM

备注:以下例子中出现的JohnsonWeb, JohnsonVm均是虚拟机的名称.在运行Powershell脚本之前,请导入您的订阅文件. 根据条件启动/关闭虚拟机,例如根据虚拟机名称,批量启动/关闭 启动虚拟机 $vmNames = New-Object System.Collections.ArrayList $vmNames.Add("JohnsonWeb") $vmNames.Add("JohnsonVm") foreach($vm in Get-Azure

WindowsAzure Powershell脚本定时启动关机Azure VM

说到windowsazure对于当下不是一个新鲜话题了,但是对于功能来说还是有点期待的,毕竟在云服务的世界里windowsazure还是一个菜鸟了.同样我们都知道,对于windowsazure上的服务操作我们有很多方式可以操作,比如:portal页面,powershell with azure及azure pack等,其他的都是图形界面操作,操作相对简单,今天咱们就说说通过windows azure powershell命令来管理windows azure上的部分服务,powershell操作命

Azure PowerShell (9) 使用PowerShell导出订阅下所有的Azure VM的Public IP和Private IP

<Windows Azure Platform 系列文章目录> 笔者在之前的工作中,有客户提出想一次性查看Azure订阅下的所有Azure VM的Public IP和Private IP.笔者研究了一下Azure相关的PowerShell,可以实现.在这里笔者简单分享一下: 1.将http://files.cnblogs.com/files/threestone/ExportVMList.rar文件保存至本地目录 2.安装Windows Azure PowerShell工具,下载地址是:htt

Azure终结点访问控制列表ACL

对于公有云来说,用户最关心的莫过于安全方面的问题了.借助本文,我们来了解下Azure中的访问控制列表. 首先我们来看下什么是终结点访问控制列表ACL? 终结点访问控制列表 (ACL) 是可用于 Azure 部署的安全增强. 利用 ACL,可以选择允许还是拒绝虚拟机终结点的流量. 此数据包筛选功能额外提供了一层安全性. 只能为终结点指定网络 ACL, 无法为虚拟网络或虚拟网络中包含的特定子网指定 ACL. 建议尽可能使用网络安全组 (NSG),而不要使用 ACL. 使用网络 ACL 可以实现以下目

PowerShell 操作 Azure SQL Active Geo-Replication

前文中我们比较全面的介绍了 Azure SQL Database Active Geo-Replication 的主要特点和优势.接下来我们将从自动化的角度介绍如何通过 PowerShell 在项目中实现 Active Geo-Replication 的操作. 从 Azure PowerShell 开始 MS 专门为管理 Azure 写了一套 PowerShell 组件称为 Azure PowerShell.我们就是要使用这套组件中提供的接口来操作 Active Geo-Replication.