利用Service Management Automation来管理第三方系统

Service Management Automation(SMA)允许您同时管理微软产品和外部系统。无论是编写自己的 PowerShell模块,还是使用现有的第三方模块,都可轻松合并到 SMA Runbook 中。在 TechEd 和 //Build 大会(关于 Azure 自动化)的一些演示中,我们已经展示了如何监控您的 Windows Azure 包(WAP)和 Azure 资源,以及出现问题时如何发送警报。当然,这也可以通过使用非微软的产品来完成。在这篇文章中,您将学习如何编写用于连接和监控亚马逊网络服务(AWS)和 VMware 虚拟机的 Runbook。

由于这篇文章介绍的是第三方软件,我就不再介绍连接到 Azure 的方法了,尽管在 Runbook 中您可能会经常遇到这个问题。但我们在 SMA 中提供了一个名为 Sample-Managing-Azure 的样本,您可以用这种方法连接至 Azure。

Runbook 概述

如果您一直关注我们的博客,就会知道创建小型化、模块化的 Runbook 一直是我们向您推荐的最佳实践。以下是创建小型且可重复使用的 Runbook 后如何令自动化更加简便的一个例子。下图显示了 Runbook 的流程:

                     

使用该模式,您可以根据云解决方案所使用的系统来连接并监控 AWS 或 VMware (或 Azure)源。每个 Runbook 都将依赖于 Send-Email Runbook。请注意,您可以用其他使用不同警报技术或服务的 Runbook 轻松替换 Send-Email Runbook。如果虚拟机的服务正在运行,那么当 AWS 和 VMware 连接至各自的服务后会进行检查。这些 Runbook 会向Watch-VMRunningState Runbook 返回一个未运行的虚拟机阵列。接着,一封电子邮件将发送至 on-call alias,通知它们:运行公司一个重要服务的虚拟机已经关闭。

一旦与 AWS 或 VMware 两者之一连接,即可轻松自定义这些 Runbook,以满足您的个人需求。例如,您可以监控内存、CPU 或网络 IO 等指标,如果超过其中任一指标,则呼叫 Alert Runbook。您还能够轻松添加 Logging Runbook 来跟踪虚拟机的性能信息。通过这种方式,可以确保您所有的服务(包括使用云平台的服务)都拥有一致的解决方案。

要参照本文中的示例,您可以从 Script Center (点击这里)下载 Runbooks。如果您不使用 AWS 或 VMware,可忽略该示例,并在 Watch-VMRunningState Runbook 中将相应的代码注释掉。

按下列顺序导入和发布 Runbook,以便子级 Runbook 先于父级 Runbook 发布:

  1. Send-Email
  2. Get-AwsProblemVMs
  3. Get-VMwareProblemVMs
  4. Watch-VMRunningState

发布“Send-Email” Runbook 之前,请务必在 Runbook 中编辑 $SmtpService 邮件服务。您还需要创建一个用来与您的邮件服务连接的“EmailCredentials”PS 凭据;一个用来发送VMware问题邮件的“VMwareOnCallEmail”字符串;以及一个用来发送 AWS VM 问题邮件的“AWSOnCallEmail”字符串。

AWS

本节将提供如何设置 SMA,以便管理 AWS 资源的详细信息。如果您只对 VMware 感兴趣,可直接跳至下一节。

设置资产

首先,您需要有一个 AWS 订阅,并至少创建一个 EC2 实例,以便研究这里的示例。同时,您还需要有 AWS PowerShell 模块。

根据以下步骤下载并导入 AWS 模块:

1. 从这个网站下载开发者工具:https://aws.amazon.com/powershell/

  

2. 工具包下载完成后,模块位于“...\AWS Tools\PowerShell”文件夹。

  

3. 将 AWSPowerShell 文件夹解压缩。

4. 导入模块,进入 ASSETS 选项卡,选择“Import”。选择 AWSPowerShell.zip 文件。

  

访问密钥

要从 PowerShell 连接到您的 AWS 帐户,需要指定您的访问密钥和密钥。您可以根据这里的说明(网址:https://docs.aws.amazon.com/powershell/latest/userguide/pstools-appendix-signup.html)创建一个新的 IAM 帐户和/或生成一个新的访问/密钥对。

获得访问密钥后,进入 SMA 的 Assets 选项。创建一个 PS 凭据,并将 AWS 访问密钥作为用户名,AWS 密钥作为密码。我将我的凭据命名为“AWSCredentials”。如果您决定以不同的方式命名凭据和所使用的样本,请务必在 Get-AwsProblemVMs Runbook 中更新 PS 凭据名称。

监控 AWS 资源

现在,您已经创建了所有需要与 AWS 通信的资产。接着打开 Get-AwsProblemVMs Runbook,看看它是做什么的。

首先,Runbook 检索了您所存储的密钥的值,并为默认的 AWS 区域设置了值。

      #Retrieve the values for the access and secret key     $Creds = Get-AutomationPSCredential -Name 'AWSCredentials'     $AccessKey = $Creds.UserName     $SecretKey =  $Creds.GetNetworkCredential().Password     $DefaultRegion = "us-west-1"   

下一部分代码包含在 InlineScript 中。在这一部分中,Runbook 为会话和默认区域设置了访问密钥,因此无需在每一个命令中重复引用。

  #Set the credentials and default region for the session Set-AWSCredentials -AccessKey $using:AccessKey -SecretKey $using:SecretKey Set-DefaultAWSRegion -Region $using:DefaultRegion

如果您想要学习更多关于使用 PowerShell 设置访问密钥的知识,可点击这里

接着,您可以检索每个 EC2 区域内的所有实例并检查机器状态。由于Instances.State 是一个对象,所以它是 InlineScript 外的反序列化。基于这一点,如果虚拟机未运行,则 Runbook 只存储实例 ID 并返回有问题实例的阵列。$VMsWithProblems 继而从 InlineScript 和 Get-AwsProblemVMs Runbook 返回。

          #Get each instance in every region & check if it is running         $Instances = (Get-EC2Region | Get-EC2Instance).Instances         ForEach ($Instance in $Instances)          {             if ($Instance.State.Name -ne "running")              {                 $VMsWithProblems += $Instance.InstanceID             }         }

 

最后,在 Watch-VMRunningState Runbook 中,如果有任何虚拟机被认定为未运行,Send-Email Runbook 就会被调用:

          if ($checkAWS) {             #List of new failed VMs             $InstanceIDs = @()             $HasNewFailures = $false                         #Get the machine IDs of any VMs that are not running             $StoppedAWSVMs = Get-AwsProblemVMs             ForEach ($VM in $StoppedAWSVMs) {                 #Remove VMs for which notifications have been sent                 if ($DownAwsMachines -NotContains $VM) {                     "AWS VM instance: $VM is not responding"                     $InstanceIDs += $VM                     $HasNewFailures = $true                 }             }                         #Send email alert             if ($HasNewFailures) {                 $AWSOnCallEmail = Get-AutomationVariable -Name 'AWSOnCallEmail'                  $Message = "AWS Instance ID(s): `r" + ($InstanceIDs -join "`r")                 $Subject = "Warning - AWS VM is down!"                 Send-Email -Body $Message  -Subject $Subject -SendTo $AWSOnCallEmail             }                         $DownAwsMachines = $StoppedAWSVMs         } 

 

VMware

现在,让我们转向监控 VMware 资源。我将引导您完成下载 PowerCLI 管理单元;将其转换成可在 SMA 中使用的可移植模块;最后连接至您的服务器并检查您的虚拟机状态。

设置资产

为了能够使用 PowerCLI 命令,您必须首先在计算机或每个 Runbook Worker 中安装可运行SMA的 VMWare PowerCLI。要下载 PowerCLI 请点击:https://my.vmware.com/web/vmware/details?downloadGroup=PCLI550&productId=353

由于 PowerCLI 是一个管理单元且依靠其 DLL 来运行,所以必须采取将 PowerCLI 转换成可移植模块这一额外步骤,才能使用 SMA 中的命令。可移植模块允许您导入和使用模块,否则将难以导入至 SMA。正如上面所提到的,您可以在计算机或每个 Runbook Worker 中安装 PowerCLI,或在另一台计算机中安装 cmdlet,并使用 InlineScript 引用该模块。在这个例子中,我远程连接至 VMware 服务器。如果您想了解更多关于可移植模块的内容,请点击这里

在 SMA PowerShell 模块中使用 New-SmaPortableModule 命令来创建即将加载至 SMA的可移植模块。

代码片段:

 

$session = New-PSSession

New-SmaPortableModule -Session $session -ModuleName "VMware.VimAutomation.Core" -OutputPath "C:\Users\elcooper\Desktop" -IsSnapIn

屏幕截图:

  

找到您指定的位于 OutputPath 下的 .zip 文件。现在,准备开始 SMA 的操作并将 VMware可移植模块上传至资产存储。

除了 VMware 可移植模块之外,Get-VMwareProblemVMs Runbook 在服务器名称和凭据中还使用两个变量。我的服务器名称是“VMwareServer”,而用户 vSphere 的用户名和密码则是“VMWareCredentials”。如果您使用的是样本 Runbook,并想使用不同的变量,请确保在 Runbook 一开始就更新这些名称。

监控 VMware 资源

Get-VMwareProblemVMs Runbook 请求您存储在资产中的服务器名称、用户名和密码,进而检查位于该服务器上的所有虚拟机状态。然后返回未运行的机器信息。每个 PowerCLI 命令都必须在 InlineScript 中。如果您在虚拟主机上安装了 PowerCLI,则需要按以下方式引用该主机:

InlineScript {

#Some PowerCLI command goes here

} -PSComputerName "MyHost"

 

和 AWS Runbook 一样,这个 Runbook 先要检索您的订阅信息中所包含的资产:

      #Retrieve server and credentials from Assets     $Server = Get-AutomationVariable -Name 'VMwareServer'     $Creds = Get-AutomationPSCredential -Name 'VMWareCredentials'     $Username = $Creds.UserName     $Password = $Creds.GetNetworkCredential().Password    

由于您所引用的 VMware 模块是一个可移植模块,所以其余的大部分工作都是在InlineScript 的部分代码中完成。首先,如果您还没有将管理单元添加至安装了 PowerCLI 的机器的 PowerShell 配置文件中,则应先将其添加至会话。然后再连接到服务器。

  Add-PSSnapin VMware.VimAutomation.Core        #Connect to the server if not connected. if ($DefaultVIServers.Count -lt 1) {     Connect-VIServer -Server $using:Server -User $using:Username -Password $using:Password }      

连接到服务器后,便可以在该服务器上执行对资源的操作。如果其未运行,那么样本 Runbook就会检查 vSphere 主机上所有的虚拟机,并存储未运行的机器名称。

          #Get each VM & make sure it is up and running         $VMs = Get-VM                  $VMsWithProblems = @()         foreach ($VM in $VMs) {             if ($VM.powerstate -ne "PoweredOn") {                 $VMsWithProblems += $VM.Name             }          }   

然后,Get-VMwareProblemVMs Runbook 会将所有未运行的虚拟机返回给 Watch-VMRunningState Runbook。如果有一个尚未返回,则会发送一封电子邮件。

          if ($checkVMware) {             #List of new failed VMs             $VMs = @()             $HasNewFailures = $false                         #Get the machine names of any VMs that are not running             $StoppedVMwareVMs = Get-VMwareProblemVMs                         ForEach ($VM in $StoppedVMwareVMs) {                 #Remove VMs for which notifications have been sent                 if ($DownVMwareMachines -NotContains $VM) {                    "VMware VM is not responding"                     $VMs += $VM                     $HasNewFailures = $true                 }             }                         #Send email alert if one has not already been sent             if ($HasNewFailures) {                     $VMwareOnCall = Get-AutomationVariable -Name 'VMwareOnCallEmail'                     $Message = "VMware VM(s): `r" + ($VMs -join "`r")                     $Subject = "Warning - VMware VM is down!"                     Send-Email -Body $Message  -Subject $Subject -SendTo $VMwareOnCall             }                         $DownVMwareMachines = $StoppedVMwareVMs         }

 

结论

如果您使用 VMware 或 AWS,则可以使用这些样本作为参考,从而帮助您管理来自于 SMA 的资源。从本文中可以看到,通过使用 SMA,您可以对微软或第三方软件中的各种资源开发出一致的解决方案。您使用的是哪些第三方系统?请随时为我们提供反馈,以便我们能继续为您提供相关样本,从而让您的工作更加顺利。