2014年9月2日星期二

使用powshell脚本管理虚机

下载实验资产/在 Github 上执行自我复制/报告问题

概述

在本动手实验中,您将了解在 Windows Azure 中自动部署和管理虚拟机的功能。

目标

在本动手实验中,您将了解如何:
  • 设置虚拟机
  • 完成设置后配置
  • 远程重新启动或启动
  • 管理磁盘和映像库
  • 导出和导入虚拟机

先决条件

完成本动手实验需要以下各项:
注意
注意: 本实验设计为使用 Windows 7 操作系统。

设置

为了完成本动手实验中的练习,您需要对环境进行设置。
  1. 打开 Windows 资源管理器窗口并浏览到本实验的 source 文件夹。
  2. 使用管理员权限执行 Setup.cmd 文件,以启动将配置您的环境并安装本实验的 Visual Studio 代码段的设置过程。
  3. 如果显示“用户帐户控制”对话框,请确认操作以继续。
    注意
    注意: 确保在运行设置之前,您已检查本实验的所有依赖项。

练习

本动手实验包括以下练习:
  1. 使用 PowerShell Cmdlet 设置虚拟机
  2. 使用 PowerShell Cmdlet 进行高级设置

入门:获取订阅的凭据

为了完成本实验,您将需要订阅的安全凭据。Windows Azure 允许您下载发布设置文件,此文件包含在开发环境中管理您的帐户所需的全部信息。
任务 1 - 下载和导入发布设置文件
注意
注意: 如果在上一实验中已在同一计算机上完成这些步骤,可转到练习 1。
在此任务中,您将登录到 Windows Azure 门户并下载发布设置文件。此文件包含要在您的开发环境中使用的、有关您的 Windows Azure 订阅的安全凭据和其他信息。然后,您将使用 Windows Azure Cmdlet 导入此文件,以便安装证书和获取帐户信息。
  1. 打开 Internet Explorer 浏览器并转到 https://windows.azure.com/download/publishprofile.aspx
  2. 使用与您的 Windows Azure 帐户关联的凭据登录。
  3. 将发布设置文件保存到本地计算机。
    下载发布设置文件
    下载发布设置文件
    注意
    注意:下载页将演示如何使用 Visual Studio“发布”框导入发布设置文件。本实验将演示如何改用 Windows Azure PowerShell Cmdlet 导入此文件。
  4. 在“Windows Azure”下的“开始”菜单中,右键单击“Windows Azure PowerShell”,并选择“以管理员身份运行”
  5. 将 PowerShell 执行策略更改为 RemoteSigned。在要求确认时,请按 Y,然后按 Enter
    Set-ExecutionPolicy RemoteSigned
    注意
    注意:Set-ExecutionPolicy cmdlet 使您能够确定将允许哪些 Windows PowerShell 脚本(如果有)在您的计算机上运行。Windows PowerShell 具有 4 种不同的执行策略:
    有关执行策略的详细信息,请参考以下 TechNet 文章:http://technet.microsoft.com/zh-cn/library/ee176961.aspx
  6. 以下脚本可导入您的发布设置文件并生成包含您的帐户信息的 XML 文件。您将在实验中使用这些值来管理 Windows Azure 订阅。将占位符替换为发布设置文件的路径并执行该脚本。
    Import-AzurePublishSettingsFile '[YOUR-PUBLISH-SETTINGS-PATH]'
  7. 执行以下命令,并记下将在练习中使用的订阅名称和存储帐户名称。
    Get-AzureSubscription | select SubscriptionName Get-AzureStorageAccount | select StorageAccountName
  8. 如果您没有上面返回的存储帐户,则应先创建一个。
    运行以下命令来确定要在其中创建存储帐户的数据中心。确保您挑选的数据中心支持 PersistentVMRole。
    Get-AzureLocation
  9. 创建存储帐户:
    New-AzureStorageAccount -StorageAccountName '[YOUR-SUBSCRIPTION-NAME]' -Location '[DC-LOCATION]'
  10. 执行以下命令以设置您的订阅的当前存储帐户。
    Set-AzureSubscription -SubscriptionName '[YOUR-SUBSCRIPTION-NAME]' -CurrentStorageAccount '[YOUR-STORAGE-ACCOUNT]'

练习 1:使用 PowerShell Cmdlet 设置虚拟机

在此练习中,您将了解如何使用 PowerShell 在 Windows Azure 中设置简单的虚拟机。

任务 1 - 设置虚拟机
在 Windows Azure 中创建虚拟机的第一步是为终结点或数据磁盘等项定义虚拟机配置,然后定义 VM 将驻留在哪个云服务和数据中心中。
  1. 执行以下命令,以检索可用的数据中心位置。
    Get-AzureLocation | select name
  2. 使用要部署到的数据中心的名称定义 $dclocation 变量。
    $dclocation = '[YOUR-LOCATION]'
    在选择位置后,您将需要创建虚拟机配置。
    若要创建虚拟机,您将需要以下几条信息:将包含 VM 的云服务名称,以及 VM 映像名称。
  3. 为您的云服务选择唯一名称。若要验证名称是否已被使用,可以使用 Test-AzureName cmdlet。如果服务名称已存在,该命令将返回 True。
    Test-AzureName -Service '[YOUR-CLOUD-SERVICE-NAME]'  $cloudSvcName = '[YOUR-CLOUD-SERVICE-NAME]'
  4. 选择要用作 VM 基础的 VM 映像。
    <h1>Retrieves all available VM Images</h1>  Get-AzureVMImage | select ImageName
    $image = '[YOUR-SELECTED-IMAGE-NAME]'
  5. 接下来,根据您选择的是 Windows 还是 Linux 在下面选择 VM 创建脚本。
    1. 映像中的 Windows 虚拟机。
      $adminPassword = '[YOUR-PASSWORD]' $vmname = 'mytestvm1'  New-AzureQuickVM -Windows -ServiceName $cloudSvcName -Name $vmname -ImageName $image -Password $adminPassword -Location $dclocation
    2. 映像中的 Linux 虚拟机。请注意,映像已更改,并且 -OS 开关指定 Linux 作为操作系统。
      $linuxuser = '[CHOOSE-USERNAME]' $adminPassword = '[YOUR-PASSWORD]' $vmname = 'mytestvm1'  New-AzureQuickVM -Linux -ServiceName $cloudSvcName -Name $vmname -ImageName $image -LinuxUser $linuxuser -Password $adminPassword -Location $dclocation
    注意
    注意:对 New-AzureQuickVM 或 New-AzureVM 指定 -Location 会指示 cmdlet 尝试将云服务创建为虚拟机的容器。在创建第一台新虚拟机时使用此选项,而在向同一云服务添加新虚拟机时忽略它。
  6. 在创建虚拟机后,可以使用 Get-AzureVM cmdlet 检查该虚拟机。以下命令将枚举云服务中所有虚拟机的详细信息。
    Get-AzureVM -ServiceName $cloudSvcName
    为了更具体,可以使用 -Name 参数。
    Get-AzureVM -ServiceName $cloudSvcName -Name $vmname
  7. Windows Azure PowerShell Cmdlet 支持使用 Restart-AzureVMStop-AzureVM 和 Start-AzureVM命令执行重新启动、停止和启动操作。
    使用以下命令,您将能够启动、停止以及重新启动您的 VM。
    <h1>Restart</h1>  Restart-AzureVM -ServiceName $cloudSvcName -Name $vmname  <h1>Shutdown</h1>  Stop-AzureVM -ServiceName $cloudSvcName -Name $vmname  <h1>Start</h1>  Start-AzureVM -ServiceName $cloudSvcName -Name $vmname
    注意
    注意: 确保在执行这些命令之前您的虚拟机已完成设置。

练习 2:使用 PowerShell Cmdlet 进行高级设置

不仅仅是创建单个非定制虚拟机。除了使用 New-AzureVMConfig/New-AzureVM cmdlet 组合批量创建 VM 外,您还可以在设置时配置数据磁盘、磁盘缓存设置、网络终结点以及自动配置域联接设置。
下面的示例创建两个已附加 50 GB 数据磁盘的新虚拟机,且在端口 80 上打开经过负载平衡的终结点以允许 http 通信。
注意
注意:您仍将需要登录到虚拟机并通过磁盘管理器配置/格式化数据磁盘。在下一节中,您将找到这些步骤的演练信息。
示例:创建多个 VM (Windows)
$vmname2 = 'mytestvm2'    $vmname3 = 'mytestvm3'      $vm2 = New-AzureVMConfig -Name $vmname2 -InstanceSize ExtraSmall -ImageName $image |              Add-AzureProvisioningConfig -Windows -Password $adminPassword |              Add-AzureDataDisk -CreateNew -DiskSizeInGB 50 -DiskLabel 'datadisk1' -LUN 0 |              Add-AzureEndpoint -Protocol tcp -LocalPort 80 -PublicPort 80 -Name 'web' `                  -LBSetName 'lbweb' -ProbePort 80 -ProbeProtocol http -ProbePath '/'      $vm3 = New-AzureVMConfig -Name $vmname3 -InstanceSize ExtraSmall -ImageName $image |           Add-AzureProvisioningConfig -Windows -Password $adminPassword  |            Add-AzureDataDisk -CreateNew -DiskSizeInGB 50 -DiskLabel 'datadisk2' -LUN 0  |            Add-AzureEndpoint -Protocol tcp -LocalPort 80 -PublicPort 80 -Name 'web' `                  -LBSetName 'lbweb' -ProbePort 80 -ProbeProtocol http -ProbePath '/'      New-AzureVM -ServiceName $cloudSvcName -VMs $vm2,$vm3
示例:创建第二台 VM (Linux)
$vmname2 = 'mytestvm2'    $vmname3 = 'mytestvm3'     $vm2 = New-AzureVMConfig -Name $vmname2 -InstanceSize ExtraSmall -ImageName $image |           Add-AzureProvisioningConfig -Linux -LinuxUser $linuxUser -Password $adminPassword |           Add-AzureDataDisk -CreateNew -DiskSizeInGB 50 -DiskLabel 'datadisk1' -LUN 0 |            Add-AzureEndpoint -Protocol tcp -LocalPort 80 -PublicPort 80 -Name 'web' `                  -LBSetName 'lbweb' -ProbePort 80 -ProbeProtocol http -ProbePath '/'      $vm3 = New-AzureVMConfig -Name $vmname3 -InstanceSize ExtraSmall -ImageName $image |             Add-AzureProvisioningConfig -Linux -LinuxUser $linuxUser -Password $adminPassword |             Add-AzureDataDisk -CreateNew -DiskSizeInGB 50 -DiskLabel 'datadisk2' -LUN 0 |             Add-AzureEndpoint -Protocol tcp -LocalPort 80 -PublicPort 80 -Name 'web' `                 -LBSetName 'lbweb' -ProbePort 80 -ProbeProtocol http -ProbePath '/'      New-AzureVM -ServiceName $cloudSvcName -VMs $vm2,$vm3

任务 1 - 完成设置后配置
修改现有虚拟机需要通过调用 Get-AzureVM 来检索当前设置,修改这些设置,然后调用 Update-AzureVMcmdlet 以保存相应更改。
可以热添加和删除数据磁盘和网络终结点。与更改虚拟机的实例大小一样,更改磁盘缓存设置也需要重新启动。
以下示例使用 Get-AzureVM cmdlet 检索 VM 对象并将其发送到 PowerShell 管道。
带 CreateNew 参数的 Add-AzureDataDisk 允许您向虚拟机中动态添加存储。在本例中,我们将调用该命令两次,以将每个未格式化的空 VHD 附加到服务器,每个磁盘 50 GB 存储空间。-LUN 参数指明将附加的设备的顺序,并且可以选择使用 -MediaLocation 指定要在存储中保存新创建的 VHD 的位置。
Add-AzureDataDisk 还支持使用 Import 参数在磁盘库中附加磁盘,以及使用 -ImportFrom 附加存储中已存在的磁盘。
该示例还使用 Add-AzureEndpoint 命令在内部为 TCP 端口 1433 添加一个可在外部侦听端口 2000 的新终结点。
注意
注意: 若要连接到 SQL,您仍将需要在 Windows Server 防火墙中启用 1433 以进行连接
  1. 使用以下脚本向现有虚拟机中热添加数据磁盘和终结点。
    $vmname = 'mytestvm1'  $vm = Get-AzureVM -Name $vmname -ServiceName $cloudSvcName |     Add-AzureDataDisk -CreateNew -DiskSizeInGB 50 -DiskLabel 'datadisk1' -LUN 0 |     Add-AzureDataDisk -CreateNew -DiskSizeInGB 50 -DiskLabel 'translogs1' -LUN 1 |     Add-AzureEndpoint -Protocol tcp -LocalPort 1433 -PublicPort 2000 -Name 'sql' |     Update-AzureVM
  2. 在调用 Update-AzureVM 后,您将需要登录到虚拟机以完成磁盘配置,或者通过 PowerShell 启用远程管理以完成磁盘初始化。
    uninitdisk
    VM 磁盘
  3. 右键单击每个磁盘(在左侧)并将其标记为联机。
  4. 在磁盘联机后,您将需要右键单击一个磁盘,然后单击“初始化”(在左侧)。
    InitializeDisk
    初始化磁盘
  5. 在初始化磁盘后,您将需要右键单击右侧并选择“创建简单卷”(软件 RAID 受支持,因此也将提供这些选项)。“创建简单卷”向导将允许您格式化磁盘并装入它们以供使用。
    formatteddisks
    格式化磁盘
  6. 您可以通过调用 Set-AzureDataDisk 并配置 HostCaching 参数来控制数据磁盘的磁盘缓存设置。HostCaching 的有效值为 ReadOnlyReadWrite 和 None
    注意
    注意:此更改在主机级别进行并且不会反映在磁盘管理器中。默认情况下,在数据磁盘上禁用写入缓存,而启用读取缓存。
  7. 使用以下脚本在数据磁盘上启用写入缓存并查看生成的更改。
    $vm = Get-AzureVM -Name $vmName -ServiceName $cloudSvcName  |        Set-AzureDataDisk -HostCaching ReadWrite -LUN 0 |        Set-AzureDataDisk -HostCaching ReadWrite -LUN 1 |        Update-AzureVM  Get-AzureVM -ServiceName $cloudSvcName -Name $vmname | Get-AzureDataDisk
任务 2 - 需要重新启动的更改
在应用某些更改后需要重新启动虚拟机。通过使用 Set-AzureRoleSize 更改实例大小,使用 Set-AzureOSDisk 修改 OS 磁盘缓存设置,或者使用 Set-Subnet 在子网之间移动虚拟机来对基础硬件进行更改,都会导致虚拟机自动重新启动。
  1. 运行以下脚本以禁用写入磁盘缓存,从而将 OS 磁盘的写入缓存设置从“已启用写入缓存”更改为“已禁用写入缓存”。执行之后,虚拟机将使用新设置重新启动。
    Get-AzureVM -ServiceName $cloudSvcName -Name $vmName |     Set-AzureDataDisk -HostCaching ReadOnly -LUN 0|     Set-AzureDataDisk -HostCaching ReadOnly -LUN 1|     Update-AzureVM
  2. 运行以下脚本以更改虚拟机的实例大小。
    注意
    注意:下面的代码段将设置指定虚拟机的实例大小。这在设置新硬件时需要重新启动。
    Get-AzureVM -ServiceName $cloudSvcName -Name $vmName |     Set-AzureVMSize -InstanceSize Medium |     Update-AzureVM

任务 3 - 管理磁盘映像
可使用 PowerShell 轻松查看磁盘和映像存储库中的所有数据磁盘或映像。运行 Get-AzureDisk 命令将枚举您的订阅中的所有数据磁盘。
  1. 使用以下命令可检索您的订阅中的所有磁盘。
    Get-AzureDisk
  2. 您可以使用 PowerShell 的内置功能限制检索结果。例如,在此示例中,您将能够找到特定虚拟机的 VHD 映像。
    $vmname = 'mytestvm2' Get-AzureDisk | Where { $_.AttachedTo.RoleName -eq $vmname }
  3. 目前,删除虚拟机时不会同时删除基础 VHD。PowerShell 使您能够在删除虚拟机时清理基础存储。
    以下脚本将删除特定虚拟机及其磁盘。
    $vmname = 'mytestvm2' $vmDisks = Get-AzureDisk | Where { $_.AttachedTo.RoleName -eq $vmname }  Remove-AzureVM -ServiceName $cloudSvcName -Name $vmname   $vmDisks | foreach {     Remove-AzureDisk -DiskName $_.DiskName -DeleteVHD }
  4. 可通过现成的类似功能来管理您的订阅中的映像存储库。使用以下脚本,您将标识用户创建的映像。
    Get-AzureVMImage | Where { $_.Category -eq 'User' }
任务 4 - 导出和导入虚拟机配置以及为其创建映像
Windows Azure IaaS 能够自定义虚拟机,使用 sysprep 等工具将该虚拟机一般化,然后将其捕获到映像库。您可以借助此功能创建稍后可在生成多个相同计算机时重用的自定义映像。从 PowerShell 中完成此操作的步骤相对比较简单。
  1. 执行以下脚本以创建将成为映像基础的 VM。
    1. 适用于 Windows VM。
      $vmname = 'winvmforimg' New-AzureVMConfig -Name $vmname -InstanceSize Small -ImageName $image |     Add-AzureProvisioningConfig -Windows -Password $adminPassword |     New-AzureVM -ServiceName $cloudSvcName
    2. 适用于 Linux VM。
      $vmname = 'linuxvmforimg' New-AzureVMConfig -Name $vmname -InstanceSize Small -ImageName $image |     Add-AzureProvisioningConfig -Linux -LinuxUser $linuxuser -Password $adminPassword |     New-AzureVM -ServiceName $cloudSvcName
  2. 一般化虚拟机以进行捕获。此时,您将使用捕获的映像所需的设置自定义 VM。
    1. 使用 RDP 或 SSH 连接到虚拟机
    2. 对于 Windows,从 Windows 中使用 sysprep。选择“进入系统全新体验(OOBE)”,选中“一般化”并选择“关闭”
      sysprep
      SysPrep
    3. 对于 Linux 虚拟机,运行以下脚本。
      sudo /user/sbin/waagent -deprovision+user
  3. 使用 Save-AzureVMImage cmdlet 生成新映像。
    注意
    注意:在运行 Save-AzureVMImage cmdlet 之前,必须完全关闭 VM。您可以通过键入 Get-AzureVM -Name vmname 检查 VM 的状态。
    Save-AzureVMImage -ServiceName $cloudSvcName -Name $vmname -NewImageName [YOUR-NEW-VM-IMAGE-NAME] -NewImageLabel [YOUR-NEW-IMAGE-LABEL] -PostCaptureAction Delete
    注意
    注意:Save-AzureVMImage cmdlet 使正在运行的永久性 VM 可作为映像供重新使用。对于 Windows VM,应在捕获之前对映像运行 Sysprep。在执行捕获后,您可以使用值为 Delete|Reprovision 的 PostCaptureAction 参数删除或重新设置 VM。
任务 5 - 导出和导入 VM 配置
Windows Azure PowerShell Cmdlet 提供了保存虚拟机配置的功能。当您需要完全删除虚拟机,但在某些时候又希望轻松地再次使用它时,这会很有用。通过了解以下事实可实现此目的:即,当您删除虚拟机时,默认情况下不会删除存储中的基础数据和 OS 磁盘。Export-AzureVM cmdlet 可将虚拟机的所有配置(包括磁盘名称、终结点设置等)保存到 XML 文件中。这将允许您删除虚拟机,并在稍后使用保存的配置重新创建它。
  1. 运行以下脚本以导出 VM 配置并删除部署。
    $vmname = 'mytestvm1'  Export-AzureVM -ServiceName $cloudSvcName -Name $vmname -Path 'c:\Temp\mytestvm1-config.xml'  Remove-AzureVM -ServiceName $cloudSvcName -Name $vmname
    注意
    注意: 此代码可保存 mytestvm1 虚拟机的配置,然后通过删除虚拟机来删除该配置。
    确保在执行命令之前在 C:盘中创建了一个 Temp 文件夹。
  2. 在删除部署后,您稍后可以通过保存的状态重新创建虚拟机。运行以下脚本以将 VM 配置导入新部署中。
    Import-AzureVM -Path 'c:\Temp\mytestvm1-config.xml' |      New-AzureVM -ServiceName $cloudSvcName
    注意
    注意: 在具有虚拟网络的部署中,这将生成一个新的 IP 地址,因此不建议对需要持久 IP 的 VM(如域控制器)执行此操作。
任务 6 - 管理 RDP 和 SSH 连接
默认情况下,通过 Windows Azure PowerShell cmdlet 创建的所有新虚拟机都将允许 Windows 进行 RDP 或 SSH 连接。若要禁用自动终结点创建功能,请使用 DisableRDP 或 DisableSSH 参数。这将指示 cmdlet 不要在设置期间创建 RDP 或 SSH 终结点。
若要为这些终结点发现端口,您可以使用 Get-AzureEndpoint 获得 RDP 或 SSH 输入终结点的公用端口。
  1. 终结点发现。
    Get-AzureVM -ServiceName $cloudSvcName -Name $vmname | Get-AzureEndpoint
  2. 将 RDP 文件保存到文件系统。
    Get-AzureRemoteDesktopFile -ServiceName $cloudSvcName -Name $vmname -LocalPath C:\Temp\myvmconnection.rdp
  3. 直接在下载 RDF 文件后启动 RDP 客户端。
    您可以使用 Windows Azure PowerShell cmdlet 为 Windows 计算机保存 RDP 文件或者直接从 PowerShell 中启动它。
    Get-AzureRemoteDesktopFile -ServiceName $cloudSvcName -Name $vmname -LocalPath C:\Temp\myvmconnection-2.rdp -Launch

摘要

在本动手实验中,为您演示了如何配置订阅 ID 和证书以管理 Windows Azure 虚拟机。还为您演示了设置虚拟机,以及使用需要重新启动的热添加功能和更改步骤(例如更改实例大小)修改虚拟机的基础知识。

此外,还为您演示了如何使用 Windows Azure PowerShell cmdlet 来管理您的磁盘和映像库以及导出和导入虚拟机配置的功能。

没有评论:

发表评论