自动化 – Service Management Automation Runbook 聚焦 – 按优先级启动虚拟机(第 2 部分)

原文地址:https://blogs.technet.com/b/privatecloud/archive/2013/08/29/automation-service-management-automation-runbook-spotlight-virtual-machine-startup-by-priority-part-2.aspx

大家好!

迷你系列第 2 部分的最后一篇(第 4 篇)文章(继 Douglas Adams 之后)终于与大家见面了!

文章结构

下面我们花点时间看看已经讲到了这个系列的哪个部分。我在第 1.5 部分中曾说过,以下是目前发布的 SMA 简介 系列文章集合:https://aka.ms/IntroToSMA

在本集合中,您将会发现 1 部分 1.5 部分和 Utility Runbook 聚焦 - VMM 自定义属性管理(以及其他一些与本迷你系列不存在直接关联的文章)。虽然第 1 部分和第 1.5 部分并非第 2 部分的先决条件,但强烈建议进行阅读。VMM 自定义属性管理文章中所述的功能将第 2 部分得到广泛应用。


下面继续介绍相关内容!

这是 SMA Runbook 聚焦 – 按优先级启动虚拟机迷你系列文章的 2 部分(共 2 部分) 。鉴于我将第 1 部分称为“简单示例”,第 2 部分将深入介绍了一些更加复杂的主题/功能。我们依然会利用 PowerShell v3 工作流。我们依然会从 SMA Runbook 调用工作流。甚至依然会通过 VMM 启动 Hyper-V 虚拟机。

有哪些区别?

  • 我们不再依赖 Delay start up (seconds)  字段
  • 我们不再利用 Start-Sleep 处理有关延迟
  • 我们不再“凭空猜测”启动下一个虚拟机的时机
  • 将实际的“启动组”存储到虚拟机作用域级别的 VMM 自定义属性
  • 计算虚拟机作用域级别的 VMM 自定义属性中存储的或从中检索的“启动组”数据的独特“启动优先级组”数量
    注意此前我们其实已将启动优先级组的数量存储至云作用域级别的VMM 自定义属性
  • 检索这些值以“构建 PowerShell 哈希表”,其中包含虚拟机名称的优先级和阵列(并提供对应的优先级)
  • 利用哈希表数据按优先级启动虚拟机,并通过检查 Hyper-V 集成服务来验证虚拟机启动情况

我们采取的做法


继续介绍这个示例!

鉴于先前发布的文章已经对 SMA Runbook 创建、测试、导入和运行等“流程”进行了广泛介绍,我将直接开始讲述…

先决条件

首先要确保您的 VMM 环境已为运行这些工作流/Runbook 做好准备。如上所述,VMM 自定义属性管理工作流 /Runbook 是执行本文示例的先决条件。原因在于,本文的示例依赖于 VMM 自定义属性数据。VMM 自定义属性管理工作流/Runbook 可帮助您创建自定义属性,并为其填充相应的值。这些值将用于指示虚拟机启动优先级。

因此,请务必执行以下任务(建议利用 VMM 自定义属性管理工作流/Runbook,但不强制使用):

  • 在虚拟机作用域级别创建一个自定义属性,并将其命名为 “Startup Group”
  • 创建或查找云(包含要按优先级组启动的虚拟机)
  • 更新云中每个虚拟机的 “Startup Group” 自定义属性
  • 测试是否可以通过 PowerShell 检索 “Startup Group” 自定义属性值

注意根据最新进展,我发现不一定要使用云作用域级别的自定义属性。有关更多详细信息,请参阅下一部分。


最新进展

Second order of business, is to admit that while the其次,必须承认的是,虽然先决条件一文中提供的 Get-VMMCustomPropertyValue.ps1示例很棒,但并不适用于本解决方案(因为这需要对 VMM 执行更多独特的远程调用才能加以利用,我不希望如此)。那么,如果需要改进,应该怎么办?

努力改进!

Get-VMMCustomPropertyValuesforCloudVMs

我们有一个经过改进的全新版本的 PowerShell v3 工作流/SMA Runbook。我们经针对此场景对其进行了优化。其中纳入了一小组参数,但会生成更加复杂(但更有效)的输出。下面我们来看一下:

001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 workflow Get-VMMCustomPropertyValuesforCloudVMs { param ( [PSCredential]$Creds, [string]$VMMServer, [string]$CloudName, [string]$CustomPropertyName ) InlineScript { $VMData = @{} Import-Module virtualmachinemanager Get-VMMServer -ComputerName $Using:VMMServer | Out-Null $Cloud = Get-SCCloud -Name $Using:CloudName $VMsInCloud = Get-SCVirtualMachine -Cloud $Cloud foreach ($VM in $VMsInCloud) { $CustomProperty = Get-SCCustomProperty -Name $Using:CustomPropertyName $VMData.Add($VM,(Get-SCCustomPropertyValue -InputObject $VM -CustomProperty $CustomProperty).Value) } Return $VMData } -PSComputerName $VMMServer -PSCredential $Creds }

注意由于它负责执行不同的功能(不同的输入和输出),因此不会替换上一版本。事实上,两者都可以很好地达成各自的特定目的。可以这样说,如果发现一者的优势,很可能会希望使用另一个。

下面简单介绍一下这个经过改进的全新版本的实际用途:

  • 减少参数,缩小使用范围并进行简化
  • 输出更加复杂,但包含的数据也要多得多

从本质上而言,我需要一个脚本,其中将包含云名称,可以查询 VMM 查找其关联的虚拟机,并基于虚拟机名称及相关自定义属性输出数据哈希表。这就是脚本的真正意义。而后,将可以使用哈希表输出计算(或衡量)满足 $StartupPriorityGroups 的优先启动组的唯一计数。这将使云级自定义属性需求失去效用(如上一部分所示),但如果愿意,大家仍然可以加以利用。

调用Get-VMMCustomPropertyValuesforCloudVMs 工作流 /Runbook

在下面的示例中执行 PowerShell 工作流/SMA Runbook 时,我提出仍然会在这里进行部署,以便在大家希望利用该脚本时进行使用:

001 002 003 $VMs = Get-VMMCustomPropertyValuesforCloudVMs -Creds $Creds -VMMServer $VMMServer -CloudName $CloudName -CustomPropertyName "Startup Group" $StartupPriorityGroups = ($VMs.Values | sort -Unique | measure).Count

注意我已经包含初始使用模式,以便让大家大致了解执行期间的使用方式。


Start-VMs-by-Priority-Group

以下 PowerShell v3 工作流示例已在 PowerShell ISE 中实现并测试。大家可以从此处进行复制/粘贴,也可以从 TechNet Gallery 资源(可在下方找到相关链接)提供的 PS1 文件导入。

001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 workflow Start-VMs-by-Priority-Group { param ( [string]$VMMServer, [string]$CloudName, [PSCredential]$Creds ) $VMs = Get-VMMCustomPropertyValuesforCloudVMs -Creds $Creds -VMMServer $VMMServer -CloudName $CloudName -CustomPropertyName "Startup Group" $StartupPriorityGroups = ($VMs.Values | sort -Unique | measure).Count $StartupGroupListOrdered = InlineScript { if ($Using:StartupPriorityGroups -gt 0) { $StartupGroupList = @{} for( $i = 1; $i -le $StartupPriorityGroups; $i++ ) { $VMList = @() $VMs = $Using:VMs foreach ($VM in ($VMs.GetEnumerator() | Where-Object {$_.Value -eq $i})) { $VMList += $VM.Name } $StartupGroupList.Add($i,$VMList) } Return $StartupGroupList.GetEnumerator() | Sort-Object Name } else {Return $null} } if ($StartupGroupListOrdered) { foreach ($PriorityGroup in $StartupGroupListOrdered) { foreach -parallel ($PriorityGroupVM in $PriorityGroup.Value) { InlineScript { Import-Module virtualmachinemanager Get-VMMServer -ComputerName $Using:VMMServer | Out-Null $Cloud = Get-SCCloud -Name $Using:CloudName $VM = Get-SCVirtualMachine -Name $Using:PriorityGroupVM -Cloud $Cloud Start-SCVirtualMachine -VM $VM | Out-Null do {Start-Sleep -Seconds 15} until ((Read-SCGuestInfo -VM $VM -Key FullyQualifiedDomainName -ErrorAction SilentlyContinue).KvpMap.Values) } } } } }

注意此PowerShell 的某些部分对当前推出的发布预览版System Center 2012 R2 – SMA 无效。 PowerShell 本身基于当前发布的Windows Server 2012 开发而来,因此针对当前技术执行十分有效,而不能从发布预览版SMA 执行。我已经针对后续版本的SMA 执行测试,结果证明非常有效。遗憾的是,如果要在SMA 中进行测试,将必须等到推出最终发布版本方可。有关详细信息,请参阅下面的“ SMA 版本差异性示例”部分。

调用 Start-VMs-by-Priority-Group 工作流/Runbook

以下 PowerShell v3 工作流包含用于调用上述 Runbook/工作流示例的必要脚本。

001 002 003 004 005 006 007 008 009 010 011 $VMMServer = "VMM01" $CloudName = "Primary Cloud" $Creds = Get-Credential <# Alternate method for getting credential when leveraging SMA: $Creds = Get-AutomationPSCredential -Name 'Contoso Creds' #> Start-VMs-by-Priority-Group -VMMServer $VMMServer -CloudName $CloudName -Creds $Creds

注意我包含了两种方法( SMA 凭据变量方法已进行标注)用于定义 $Creds 变量,该变量是Start-VMs-by-Priority-Group 工作流的一个参数。当然,其他方法同样可行且可接受,请随意使用最适合自身的方法。另外,此示例PS 并不属于TechNet Gallery 资源,只是内嵌式PowerShell 工作流调用。


SMA 版本差异性示例

以下示例是 PowerShell v3 同时适用于工作流与当前版本的 SMA,但不适用于发布预览版本的 SMA:

001 002 003 004 005 006 007 008 workflow Test-HashTable { $VMData = @{"spftest01" = 1; "spftest02" = 1; "spftest03" = 2; "spftest04" = 3} $StartupPriortiyGroups = ($VMData.Values | sort -Unique | measure).Count $StartupPriortiyGroups } Test-HashTable

结果:

image

注意对于我的工作流 /Runbook 而言,这是一项关键功能,我不必为其编写脚本,因为它适用于本机PowerShell v3 工作流及当前版本的SMA


在介绍本文的示例之前,我想提醒大家

VMM 自定义属性管理Runbooks/PowerShell v3 工作流是学习本文及示例的先决条件。您可以在此处找到它们:SMA 示例 – VMM 自定义属性管理(w/PowerShell v3 工作流)

在该集合中需要完成的建议步骤(要利用的 PS1 文件)如下所示:

  • Create-VMMCustomProperty.ps1
  • Update-VMMCustomPropertyValue.ps1
  • Get-VMMCustomPropertyValue.ps1 (可替换为Get-VMMCustomPropertyValuesforCloudVMs.ps1 ,与本文提供的示例类似)

下载 SMA Runbook/PowerShell v3 工作流示例

依据承诺,已将上述示例添加至 TechNet Gallery 资源…

现在资源包括以下 (2) PS1 文件,用于表示上述 (2) 示例:

  • Start-VMs-by-Priority-Group.ps1
  • Get-VMMCustomPropertyValuesforCloudVMs.ps1

在此处下载 SMA 示例 从TechNet Gallery 按优先组( w/PS v3 工作流)启动虚拟机:

BC-DLButtonDark


介绍完毕!希望这篇按优先组启动虚拟机文章为大家提供在日常数据中心任务中利用 SMA 的另一种有效示例!

如果希望了解更多 SMA 和 PowerShell v3 工作流示例,请务必查阅以下列表(随着提供更多示例不断更新):

有关 SMA 的更多信息、提示/窍门和示例解决方案,请查阅自动化跟踪系列未来发布的其他博客文章!

敬请查阅!