广告

[Azure]使用Azure Powershell重新部署ASM虚拟机

  • 浏览(905)
  • 评论(0)
  • 译者:k8s

重新部署虚拟机的主要思路是将原虚拟机以“保留磁盘”的方式删除,然后使用保留下来的磁盘重建虚拟机。

不过实际情况中,问题往往要比以上情况复杂许多,要考虑的因素例如:虚拟机的终结点,ACL,NSG,虚拟网络,子网,所在云服务的公网IP地址虚拟机内网IP地址,数据磁盘,实例级公网IP,可用性集等等。

这个脚本针对以上方面进行了恢复,对于实例级公网IP,由于不能固定,所以重建该IP地址会发生变化。此外,对于云服务存在多VIP的情况,脚本中仅仅默认IP进行了保留,如果添加了其他IP地址和云服务中仅有这一台虚拟机,这种情况下,未保留的其他云服务VIP会发生改变。

脚本如下:

  1. 帕拉姆
  2.     #Subscription名称
  3.     [Parameter(Mandatory = $ true )]
  4.     [ string ] $ SubscriptionName,
  5.     #云服务名称
  6.     [Parameter(Mandatory = $ true )]
  7.     [ string ] $ ServiceName,
  8.  
  9.     #虚拟机名称
  10.     [Parameter(Mandatory = $ true )]
  11.     [ string ] $ VmName
  12. 函数RebuildVirtualMachine()
  13. {
  14.     #收集基本虚拟机信息
  15.     写主机  “收集虚拟机基本信息…” ;
  16.     $ vm = Get-AzureVM -ServiceName $ ServiceName -Name $ VmName;
  17.     $ service = Get-AzureService -ServiceName DanEastCS;
  18.     $ deployment = Get-AzureDeployment -ServiceName $ ServiceName;
  19.     $ vmSize = $ vm.InstanceSize;
  20.     $ vnetName = $ vm.VirtualNetworkName;
  21.     $ subnetName = $ vm.VM.ConfigurationSets [0] .SubnetNames [0];
  22.     $ location = $ service.Location;
  23.     $ osType = $ vm.VM.OSVirtualHardDisk.OS;
  24.     $ availabilitySetName = $ vm.AvailabilitySetName; #  如果 不存在,$ availabilitySetName -eq $ null
  25.     写主机  “VM大小:”  $ vmSize;
  26.     写主机  “VNET:”  $ vnetName;
  27.     写主机  “子网:”  $ subnetName;
  28.     写主机  “位置:”  $ location;
  29.     写主机  “操作系统类型:”  $ vm.VM.OSVirtualHardDisk.OS;
  30.     写主机  “可用性集:”  $ availabilitySetName;
  31.     
  32.     #collect磁盘信息
  33.     写主机  “收集磁盘信息…” ;
  34.     $ osDisk = $ vm.VM.OSVirtualHardDisk; #using $ osDisk.MediaLink.AbsoluteUri to  get  vhd url
  35.     写主机  “操作系统磁盘:”  $ osDisk.MediaLink.AbsoluteUri;
  36.     $ dataDisks = $ dataDisks = $ vm.VM.DataVirtualHardDisks;
  37.     foreach  ($ dataDisks  中的 $ dataDisk)
  38.     {
  39.         写主机  “数据磁盘:”  $ dataDisk.MediaLink.AbsoluteUri;
  40.     }}
  41.     #收集端点信息和ACL
  42.     写主机  “收集端点配置…” ;
  43.     $ endpoints = $ vm | Get-AzureEndpoint; #use $ endpoints [index] .Acl.Rules  获取 acl规则
  44.     写主机$ endpoints.Count  “端点收集” ;
  45.     #将网络安全组收集到虚拟机
  46.     写主机  “收集网络安全组信息…” ;
  47.     $ networkSecurityGroupName = $ vm.VM.ConfigurationSets [0] .NetworkSecurityGroup; #  如果 不存在,$ networkSecurityGroupName -eq $ null
  48.     if  ($ networkSecurityGroupName -ne $ null
  49.     {
  50.         写主机  “网络安全组:”  $ networkSecurityGroupName;
  51.     }}
  52.     #reservationIP(Cloud Service VIP)
  53.     $ reservedIPName = $ deployment.ReservedIPName;
  54.     if  ($ reservedIPName -eq $ null
  55.     {
  56.         写主机  “CloudService VIP不保留,开始预约…” ;
  57.         $ reservedIPName = $ ServiceName +  “ReserveIP” ;
  58.         [ void ](New-AzureReservedIP -ReservedIPName $ reservedIPName -ServiceName $ ServiceName -Location $ location);
  59.         写主机  “CloudService VIP保留,保留IP名称:”  $ reservedIPName;
  60.     }}
  61.     #collect instance-level public ip address
  62.     写主机  “检查实例级公共IP配置…” ;
  63.     $ pipName = $ null ;
  64.     if  ($ vm.VM.ConfigurationSets [0] .PublicIPs.Count -gt 0)
  65.     {
  66.         $ pipName = $ vm.VM.ConfigurationSets [0] .PublicIPs [0] .Name;
  67.         写主机  “实例级公共ip:”  $ pipName;
  68.     }  else  {
  69.         写主机  “没有实例级公共IP配置” ;
  70.     }}
  71.     #collectstatic vnet ip
  72.     写主机  “收集vnet ip配置…” ;
  73.     $ dip = $ vm.IpAddress; #  如果 不存在,$ dip -eq $ null
  74.     if  ($ dip -ne $ null
  75.     {
  76.         写主机  “Vnet ip:”  $ dip;
  77.     }}
  78.     写主机  “重建虚拟机…” ;
  79.     [ void ](Remove-AzureVM -ServiceName $ ServiceName -Name $ VmName);
  80.     写主机  “删除旧虚拟机” ;
  81.     #等待一段时间磁盘被分离
  82.     睡眠(120);
  83.     写主机  “配置新虚拟机” ;
  84.     #构建虚拟机配置
  85.     $ vmConfig = New-AzureVMConfig -Name $ VmName -InstanceSize $ vmSize -DiskName $ osDisk.DiskName;
  86.     $ vmConfig = $ vmConfig | Set-AzureSubnet -SubnetNames $ subnetName;
  87.     
  88.     #attach data disks
  89.     foreach  ($ dataDisks  中的 $ dataDisk)
  90.     {
  91.         $ vmConfig = $ vmConfig | Add-AzureDataDisk -Inport -DiskName $ dataDisk.DiskName -LUN $ dataDisk.Lun -HostCaching $ dataDisk.HostCaching;
  92.     }}
  93.     #配置端点和ACL
  94.     foreach  (   $ endpoints 中的$ endpoint)
  95.     {
  96.         if  ($ endpoint.LBSetName -ne $ null
  97.         {
  98.             if  ($ endpoint.ProbePath -ne $ null
  99.             {
  100.                 $ vmConfig = $ vmConfig | Add-AzureEndpoint -Name $ endpoint.Name -Protocol $ endpoint.Protocol`
  101.                                                           -LocalPort $ endpoint.LocalPort -PublicPort $ endpoint.Port`
  102.                                                           -LBSetName $ endpoint.LBSetName -ProbePort $ endpoint.ProbePort`
  103.                                                           -ProbeProtocol $ endpoint.ProbeProtocol -ProbePath $ endpoint.ProbePath`
  104.                                                           -ProbeIntervalInSeconds $ endpoint.ProbeIntervalInSeconds`
  105.                                                           -ProbeTimeoutInSeconds $ endpoint.ProbeTimeoutInSeconds;
  106.             }  else  {
  107.                 $ vmConfig = $ vmConfig | Add-AzureEndpoint -Name $ endpoint.Name -Protocol $ endpoint.Protocol`
  108.                                                           -LocalPort $ endpoint.LocalPort -PublicPort $ endpoint.Port`
  109.                                                           -LBSetName $ endpoint.LBSetName -ProbePort $ endpoint.ProbePort`
  110.                                                           -ProbeProtocol $ endpoint.ProbeProtocol`
  111.                                                           -ProbeIntervalInSeconds $ endpoint.ProbeIntervalInSeconds`
  112.                                                           -ProbeTimeoutInSeconds $ endpoint.ProbeTimeoutInSeconds;
  113.             }}
  114.         }  else  {
  115.             $ vmConfig = $ vmConfig | Add-AzureEndpoint -Name $ endpoint.Name -Protocol $ endpoint.Protocol`
  116.                                                       -LocalPort $ endpoint.LocalPort -PublicPort $ endpoint.Port;
  117.         }}
  118.         if  ($ endpoint.InternalLoadBalancerName -ne $ null
  119.         {
  120.             $ vmConfig = $ vmConfig | Set-AzureEndpoint -Name $ endpoint.Name -InternalLoadBalancerName $ endpoint.InternalLoadBalancerName;
  121.         }}
  122.         $ vmConfig = $ vmConfig | Set-AzureEndpoint -Name $ endpoint.Name -DirectServerReturn $ endpoint.EnableDirectServerReturn -ACL $ endpoint.Acl;
  123.         if  ($ endpoint.IdleTimeoutInMinutes -ne $ null
  124.         {
  125.             $ vmConfig = $ vmConfig | Set-AzureEndpoint -Name $ endpoint.Name -IdleTimeoutInMinutes $ endpoint.IdleTimeoutInMinutes;
  126.         }}
  127.         if  ($ endpoint.LoadBalancerDistribution -ne $ null
  128.         {
  129.             $ vmConfig = $ vmConfig | Set-AzureEndpoint -Name $ endpoint.Name -LoadBalancerDistribution $ endpoint.LoadBalancerDistribution;
  130.         }}
  131.         if  ($ endpoint.VirtualIPName -ne $ null
  132.         {
  133.             $ vmConfig = $ vmConfig | Set-AzureEndpoint -Name $ endpoint.Name -VirtualIPName $ endpoint.VirtualIPName;
  134.         }}
  135.     }}
  136.     #configure instance-level public ip
  137.     if  ($ pipName -ne $ null
  138.     {
  139.         $ vmConfig = $ vmConfig | Set-AzurePublicIP -PublicIPName $ pipName;
  140.     }}
  141.     #configure vnet ip
  142.     if  ($ dip -ne $ null
  143.     {
  144.         $ vmConfig = $ vmConfig | Set-AzureStaticVNetIP -IPAddress $ dip;
  145.     }}
  146.     #配置可用性集
  147.     if  ($ availabilitySetName -ne $ null
  148.     {
  149.         $ vmConfig = $ vmConfig | Set-AzureAvailabilitySet -AvailabilitySetName $ availabilitySetName;
  150.     }}
  151.     写主机  “完成配置,创建虚拟机…” ;
  152.     [ void ]($ vmConfig | New-AzureVM -ServiceName $ ServiceName -VNetName $ vnetName -Location $ location -WaitForBoot -WarningAction Ignore);
  153.     写主机  “虚拟机创建” ;
  154.     #if reservedIP is released,re-associate it to cloudservice
  155.     $ deployment = Get-AzureDeployment -ServiceName $ ServiceName;
  156.     $ ripName = $ deployment.ReservedIPName;
  157.     if  ($ ripName -eq $ null
  158.     {
  159.         写主机  “恢复云服务保留ip …” ;
  160.         [ void ](Set-AzureReservedIPAssociation -ReservedIPName $ reservedIPName -ServiceName $ ServiceName);
  161.         写主机  “云服务保留ip恢复” ;
  162.     }}
  163.     #配置网络安全组
  164.     if  ($ networkSecurityGroupName -ne $ null
  165.     {
  166.         $ vm = Get-AzureVM -ServiceName $ ServiceName -Name $ VmName;
  167.         $ vm | Set-AzureNetworkSecurityGroupAssociation -Name $ networkSecurityGroupName -Force;
  168.     }}
  169.     写主机  “完成重建虚拟机” ;
  170. }}
  171. 函数BreakLease($ diskUrl,$ context)
  172. {
  173.     $ storageAccountName = GetPropertyFromUrl $ diskUrl  “https://” “”。;
  174.     $ containerName = GetPropertyFromUrl $ diskUrl  “.blob.core.chinacloudapi.cn /” “/” ;
  175.     $ blobName = $ diskUrl.Substring($ diskUrl.LastIndexOf(“/” )+ 1);
  176.     $ blob = Get-AzureStorageBlob -Context $ context -Container $ containerName -Blob $ blobName -ErrorAction忽略;
  177.     if  ($ blob.ICloudBlob.Properties.LeaseStatus -eq  “Locked”
  178.     {
  179.         $ blob.ICloudBlob.BreakLease();
  180.     }}
  181. }}
  182. 函数ShowWarning(){
  183.     $ yes = New-Object System.Management.Automation.Host.ChoiceDescription  “&Yes” “说明”。;
  184.     $ no = New-Object System.Management.Automation.Host.ChoiceDescription  “&No” “说明”。;
  185.     $ cancel = New-Object System.Management.Automation.Host.ChoiceDescription  “&Cancel”“Description”。;
  186.     $ options = [System.Management.Automation.Host.ChoiceDescription []]($ yes,$ no,$ cancel);
  187.     $ title =  “!!!重建这个虚拟机之前!;
  188.     $ message =“警告:临时磁盘(通常是  ‘D:\’或’ / dev / sdb’)上的数据将是`
  189.                 丢失,实例级公共IP地址不能保留(将“
  190.                 改变),你确定要  继续吗?
  191.     $ result = $ host.ui.PromptForChoice($ title,$ message,$ options,1); #0 – 是/ 1 – 否/ 2 – 取消
  192.     return  $ result;
  193. }}
  194. $ choice = ShowWarning;
  195. if  ($ choice -eq 0)
  196. {
  197.     $ cred = Get-Credential;
  198.     [ void ](Add-AzureAccount -Environment AzureChinaCloud -Credential $ cred);
  199.     [ void ](Select-AzureSubscription -SubscriptionName $ SubscriptionName);
  200.     重建虚拟机
  201. }}

 

执行过程:

PS C:\ Users \ DanielHX>&。\ [ASM] rebuild_virtualmachine.ps1 -SubscriptionName XXXXXXXX -ServiceName DanEastCS -VmName DanCentOS65

谢谢!在重建这个虚拟机之前!
警告:临时磁盘(通常为“D:\”或“/ dev / sdb”)上的数据将丢失,实例级公用IP地址
无法保留(将更改),您确定要继续吗?
[Y]是[N]否[C]取消[?]帮助(默认为“N”):y

cmdlet Get-Credential在命令管道位置1
提供以下参数的值:
Credential
收集虚拟机基本信息
VM大小:大
VNET:DanEastVNET
子网:Subnet-1
位置:China East
操作系统类型:Linux
可用性集:
收集磁盘信息…
操作系统磁盘: https : //danieleaststorage.blob.core.chinacloudapi.cn/vhds/DanEastCS-DanCentOS65-2016-05-17.vhd
数据磁盘: https : //danieleaststorage.blob.core.chinacloudapi.cn /vhds/DanServerTest-DanCentOS65-0616-DataDisk1.vhd
数据磁盘 : https: //danieleaststorage.blob.core.chinacloudapi.cn/vhds/DanServerTest-DanCentOS65-0616-DataDisk2.vhd
数据磁盘:https:
//danieleaststorage.blob.core.chinacloudapi.cn/vhds/DanServerTest-DanCentOS65-0616-DataDisk3.vhd 数据磁盘: https : //danieleaststorage.blob.core.chinacloudapi.cn/vhds/DanServerTest-DanCentOS65-0616-DataDisk4。 vhd
收集端点配置…收集
4个端点
收集网络安全组信息…
检查实例级公共IP配置…
未配置实例级公共IP
收集vnet ip配置…
Vnet ip:10.0。 0.4
重建虚拟机…
删除旧的虚拟机
配置新的虚拟机
完成配置,创建虚拟机…
虚拟机创建
将其重建虚拟机虚拟机创建完成重建虚拟机

  • 分享到:
  • icon
  • icon
  • icon
  • icon
箭头