VM 映像 PowerShell 教学系列博客文章

编辑人员注释:本文章是与 Microsoft Azure 工程的项目经理 Kay Singh 共同撰写的

正如我在第一篇博客文章中所承诺的,我又回来了,为大家分步介绍如何在 PowerShell 中使用 VM 映像。我邀请了我的同事,负责计算 PowerShell cmdlet 的PM Kay 和我一起为您解释相关细节。希望您已经使用过 VM 映像,并且最近一直在期待这篇博客文章。好了好了……我现在有点兴奋过头了。 

正如我之前所说,VM 映像是 OS 映像的继承性产品,这两种映像有很多相似之处。随着 VM 映像功能的发展,将来您可以将 VM 映像视为包含了 OS 映像的产品。虽然我们将 VM 映像和 OS 映像分开讨论,但是PowerShell 将它们统一成“über”映像实体。所以,许多使用 OS 映像时您熟悉的 PowerShell cmdlet 也适用于 VM 映像。 

我们首先简单回顾一下 OS 映像 PowerShell 知识。您可能会回想起来,要创建、列出和删除 OS 映像,可以使用以下 PowerShell 代码段:

您可以使用以下 PowerShell 代码段,通过新创建的 OS 映像部署 VM:

或者,

希望以上内容能够帮助您回顾以前的内容,下面我们将开始深入认识 VM 映像。

创建 VM 以进行捕捉

在我们开始介绍有关 VM 映像的具体内容前,我们首先需要一台后面要使用的虚拟机。现在我们根据上述内容,部署一台运行 SQL Server 2014、带有两个数据磁盘的虚拟机。创建一台带有SQL Server 2014 RTM DataWarehousing 四月版本的虚拟机的脚本如下:

VM 捕捉为通用化 VM 映像或专用化 VM 映像

在捕捉虚拟机之前,您必须确定您想要进行通用化捕捉还是专用化捕捉。在之前的博客文章中我们提到,通用化 VM 映像将作为“模型”快速创建类似的虚拟机。OS 映像也有类似的功能。专用化 VM 映像是新的映像,将作为“快照”在一个已知良好的时间点部署 VM,然后再执行相关任务,以防止该任务出错而导致虚拟机无法使用。

您还需要执行另外几个步骤才能使虚拟机准备好进行捕捉。要捕捉通用化 Windows Server VM 映像,您可以按照 Microsoft Azure 文章如何捕捉运行 Windows Server 的虚拟机映像中的步骤操作。要捕捉 Linux VM 映像,您可以按照相似的文章如何捕捉运行 Linux 的虚拟机映像操作。

我们现在接着将这台虚拟机实际捕捉为 VM 映像。捕捉过程与 OS 映像的捕捉过程类似。您需要使用现有的 Save-AzureVMImage cmdlet,但要加入新的参数,用于确定是捕捉 OS 映像还是捕捉 VM 映像。

我们先捕捉通用化 VM 映像,将其称为 myFirstVMImage。

如果您想要捕捉专用化 VM 映像,您可以使用以下代码段:

请注意,使用 OSState 参数可以指定您捕捉 VM 映像的意图。如果不使用该参数,此 cmdlet 将捕捉 OS 映像。OS 映像始终假设为已“通用化”,因此不需要 OSState 参数。

小提示:我们强烈建议您不要使用相同的名称创建两个映像(VM 映像和 OS 映像)。 我们确实允许您在 Microsoft Azure 平台上这样操作,但是您可能会碰到问题,因为该平台无法确定您的意图。

您可能会问,重复名称是如何出现的。如果您在一个客户端(例如 PowerShell)中创建 VM 映像,然后在另一个客户端(例如门户)中创建 OS 映像,就可能出现重复名称。如果您仅通过 PowerShell 创建 OS 映像和 VM 映像,当您使用相同名称创建 VM 映像和 OS 映像时,Save-AzureVMImage cmdlet 将验证名称并提示错误。

列出 VM 映像

正如前面所回顾的,使用 Get-AzureVMImage cmdlet 将同时列出用户和发布的 OS 映像。但是请等一下!如果我们现在就运行该 cmdlet,我们将看到我们刚才捕捉的 VM 映像。如果您不相信我们,试试以下 PowerShell 代码段!

现有的 Get-AzureVMImage cmdlet 不仅返回了 OS 映像,还返回了用户和发布的 VM 映像。要仅列出 VM 映像,您可以使用 DataDiskConfiguration 等仅适用于 VM 映像的属性进行过滤。 

删除 VM 映像

删除 VM 映像与删除 OS 映像相同。 

您是否记得我们曾提到过,如果有两个映像的名称相同,平台将无法确定意图?在这种情况下,以上 cmdlet 将发生错误,以防误删映像。 如果您想要删除 OS 映像,您需要在 PowerShell 中使用 Portal 或 Invoke-Rest URI 方法,直接调用 REST API。要删除 VM 映像,您也可以在 PowerShell 中使用 Invoke-Rest URI 方法。其中一个映像删除后,您可以再次使用 Remove-AzureVMImage cmdlet。如果您遇到这种情况,您可以使用以下 PowerShell 代码段,通过 Invoke-RestMethod cmdlet 删除 VM 映像: 

使用通用化 VM 映像或专用化 VM 映像部署 VM

使用通用化 VM 映像进行部署与使用 OS 映像进行部署类似,因为这两种映像都已通用化。主要区别在于,使用 VM 映像进行部署时,您无法添加额外的数据磁盘。VM 映像中应该已经包含您最初添加到虚拟机中的数据磁盘。虚拟机部署后,您可以像在任何 VM 中一样附加或移除磁盘。

与 Remove-AzureVMImage 类似,如果有两个映像的名称相同,平台会尝试确定使用哪个映像。如果平台无法确定引用的映像是否具有唯一性:是 OS 映像还是 VM 映像,将发生错误。

以下 PowerShell 代码段将使用我们先前创建的名为 myFirstVMImage 的 VM 映像部署大型虚拟机实例

现在我们看一下如何使用专用化 VM 映像进行部署,因为专用化 VM 映像稍有不同。 这种情况下不需要配置信息,因为映像没有通用化。使用专用化 VM 映像与使用磁盘类似。用户名和密码与(捕捉的)原始虚拟机相同。以下为脚本代码段: 

文章太长?没有读?我们来回顾一下要点:

  • VM 映像可以“通用化”或“专用化”,而 OS 映像只能“通用化”
  • 使用可选的 –OSState 参数可以在 Save-AzureVMImage cmdlet 中表达您的意图:保存 VM 映像而不是 OS 映像
  • Save-AzureVMImage cmdlet 不允许捕捉名称相同的 VM 映像或 OS 映像,但是使用多个客户端时您要小心。
  • Get-AzureVMImage 现在会同时返回 OS 映像和 VM 映像。
  • 如果 OS 映像和 VM 映像拥有相同的名称,Remove-AzureVMImage cmdlet 会阻止删除操作,因为平台无法确定用户意图

希望您觉得我们的 PowerShell 分步介绍有所帮助。如有任何疑问或评论,请随时与我们联系!

回头再聊……

Christine 和 Kay

本文翻译自: https://azure.microsoft.com/blog/2014/05/01/vm-image-powershell-how-to-blog-post-2/