[Azure应用]利用 PowerShell 迅速批量的建立 VM

基本流程:

# 建立資源群組
New-AzResourceGroup -ResourceGroupName TEST -Location EastAsia

# 建立可允許連線規格
$rdpRule = New-AzNetworkSecurityRuleConfig -Name rdp-rule -Description "Allow RDP" `
   -Access Allow -Protocol Tcp -Direction Inbound -Priority 100 `
   -SourceAddressPrefix Internet -SourcePortRange * `
   -DestinationAddressPrefix * -DestinationPortRange 3389


# 建立安全性群組
$nsg = New-AzNetworkSecurityGroup -ResourceGroupName TEST `
  -Location eastasia -Name TEST-NSG -SecurityRules $rdpRule


# 設定子網路參數
$subnet = New-AzVirtualNetworkSubnetConfig -Name TEST-vmSubnet `
    -AddressPrefix "10.0.1.0/25" -NetworkSecurityGroup $nsg -WarningAction SilentlyContinue

# 建立虛擬網路
$vnet = New-AzVirtualNetwork -Name Test-VNet -ResourceGroupName Test `
    -Location EastAsia -AddressPrefix "10.0.1.0/24" -Subnet $subnet `
    -WarningAction SilentlyContinue

# 建立公用 IP
$pip = New-AzPublicIpAddress -ResourceGroupName TEST -Location EastAsia  `
  -Name TEST-ip -AllocationMethod Static -DomainNameLabel testvm20191124

# 建立虛擬網卡
$nic = New-AzNetworkInterface -ResourceGroupName TEST -Location EastAsia  `
  -Name TEST-nic -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id

# 建立認證資料
$pwd='Pa$$w0rd123456'| ConvertTo-SecureString -Force -AsPlainText # Admin 密碼
$cred=New-Object PSCredential("vmadmin",$pwd)

# 設立 VM 相關參數
$vmConfig = New-AzVMConfig -VMName TEST-vm -VMSize Standard_DS2_V2 
$vmConfig | Set-AzVMOperatingSystem -Windows -ComputerName TEST -Credential $cred -TimeZone "Taipei Standard Time" 
$vmConfig | Set-AzVMSourceImage -PublisherName MicrosoftWindowsServer -Offer WindowsServer -Skus 2016-Datacenter -Version latest
$vmConfig | Add-AzVMNetworkInterface -Id $nic.Id 
$vmConfig | Set-AzVMBootDiagnostic -Disable 
$vmConfig | Set-AzVMOSDisk -Name TEST-osdisk -Caching ReadWrite -StorageAccountType "Standard_LRS" -CreateOption FromImage 

# 建立 VM
New-AzVM  -ResourceGroupName TEST -Location EastAsia  `
 -VM $vmConfig

  

 

 

 

 

下面我会先直接在 Cloud Shell 下面去用指令先去建立一个 VM,用来确定相关指令是否都可以正常使用。

1. 因为在Azure Resource Management 的模式下,因此我们要先建立「资源群组」,然后建立「连线规则」的设定( 这个不能单独存在,因此只能先设定好规则,建立网路安全群组的时候套用此项设定),建立好之后在建立「网络安全群组」,并且搭配刚刚建立的连线规则。所以我们会分别用到三个指令来建立

New-AzResourceGroup

New-AzNetworkSecurityRuleConfig

New-AzNetworkSecurityGroup

 

2. 接着测试用指令来建立「虚拟网络」,因此这里会先设定好一组「子网络设定」( 跟连线规则一样,只是先设定好子网路,然后建立虚拟网路的时候套用此项设定),然后再用指令去建立「虚拟网络」,因此这个部分我们会需要用到两个PowerShell 的指令来进行

New-AzVirtualNetworkSubnetConfig

New-AzVirtualNetwork

3. 接下来就要建立「公用IP」和「虚拟网卡」,在建立公用IP 的时候,因为懒得寄每一个VM 的IP 位置,所以会指定网域名称,但要记住这个部分只能使用小写字母和数字。这个部分主要会用到以下两个指令

New-AzPublicIpAddress

New-AzNetworkInterface

 

4. 前面建立完相关资源之后,接下来就要来预备要建立的 VM,下面会透过一些指令,准备好我们要产生的 VM 的规格,但还没有正式去建立。这一段要用到的指令会比较杂一点,我们先从前面建立 VM 登入的认证资讯,这里先透过 PCCredential 这个函数,将帐号和密码合并成为一个认证,放到 VM 的设定档内。而在产生VM 设定的时候,一开始我们先只有指定它的名称和大小( 透过New-AzVMConfig ),接着就将前面产生的认证加入( 透过Set-AzVMOperatingSystem ),然后指定VM 的Image mage 要用什么样的版本,这里我们指定使用Windows 2016 DataCenter 的版本( 透过Set-AzVMSourceImage ),接着将前面第3 步骤所建立的虚拟网卡指定到VM 内( 透过Set-AzVMNetworkInterface ),接着指定VM 开机的时候不储存开机侦测( 透过Set-AzVMBootDiagnostic ),最后则是指定我们的磁碟是采用受控磁碟,并且存放在HDD 的规格上( Set-AzVMBootDiagnostic ),因此在这一个部分我们会用到比较多的指令来做处理。

我们最后透过 Azure Portal 检查一下,果然相关资源都顺利给建好了。

 

$resourceGroup = "TEST"     # 資源群組
$location = "EastAsia"      # 區域
$name = "TEST"              # VM 名稱
$vmcount = 5                # VM 數量  
$vmadmin = "vmadmin"        # Admin 帳號
$pwd='1qaz@WSX3edc'| ConvertTo-SecureString -Force -AsPlainText # Admin 密碼

$cred=New-Object PSCredential($vmadmin,$pwd)

# 建立資源群組
New-AzResourceGroup -ResourceGroupName $resourceGroup -Location $location

# 建立可允許連線規格
$rdpRule = New-AzNetworkSecurityRuleConfig -Name rdp-rule -Description "Allow RDP" `
   -Access Allow -Protocol Tcp -Direction Inbound -Priority 100 `
   -SourceAddressPrefix Internet -SourcePortRange * `
   -DestinationAddressPrefix * -DestinationPortRange 3389

# 建立網路安全群組
$nsg = New-AzNetworkSecurityGroup -ResourceGroupName $resourceGroup  `
  -Location $location -Name $resourceGroup"-nsg" -SecurityRules $rdpRule

# 建立子網路
$subnet = New-AzVirtualNetworkSubnetConfig -Name $resourceGroup"-vmSubnet" `
    -AddressPrefix "10.0.1.0/25" -NetworkSecurityGroup $nsg -WarningAction SilentlyContinue

# 建立虛擬網路網路
$vnet = New-AzVirtualNetwork -Name $resourceGroup"-vnet" -ResourceGroupName $resourceGroup `
    -Location $location -AddressPrefix "10.0.1.0/24" -Subnet $subnet `
    -WarningAction SilentlyContinue


for($i = 1; $i -le $vmcount ; $i++)  
{
  
  $vmname = $name + ([string]$i).PadLeft(2,'0')

  # 產生公用 IP , 網域名稱要用小寫
  $pip = New-AzPublicIpAddress -ResourceGroupName $resourceGroup -Location $location `
    -Name $vmname"-ip" -AllocationMethod Static -DomainNameLabel $vmname.toLower()

  # 產生虛擬網卡
  $nic = New-AzNetworkInterface -ResourceGroupName $resourceGroup -Location $location `
    -Name $vmname"-nic" -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id

  # 建立虛擬機器的相關設定
  $vmConfig = New-AzVMConfig -VMName $vmname"-vm" -VMSize Standard_DS2_V2 
  $vmConfig | Set-AzVMOperatingSystem -Windows -ComputerName $vmname -Credential $cred -TimeZone "Taipei Standard Time" 
  $vmConfig | Set-AzVMSourceImage -PublisherName MicrosoftWindowsServer -Offer WindowsServer -Skus 2016-Datacenter -Version latest
  $vmConfig | Add-AzVMNetworkInterface -Id $nic.Id 
  $vmConfig | Set-AzVMBootDiagnostic -Disable 
  $vmConfig | Set-AzVMOSDisk -Name $vmname"-osdisk" -Caching ReadWrite -StorageAccountType "Standard_LRS" -CreateOption FromImage 

  # 建立虛擬機器並放置到背景執行
  New-AzVM -ResourceGroupName $resourceGroup -Location $location -VM $vmConfig -AsJob
}
Get-Job

  

在Cloud Shell 里面,其实最方便的不只是可以直接用PowerShell 来做维护,我个人觉得最方便的是他提供一个便利的编辑器,让你可以很方便的维护档案和执行,因为当指令少的时候虽然很方便容易,但指令多的时候就比较繁琐了。因为在 Cloud Shell 他其实是一个 ubuntu 的环境,并且加挂上许多的便捷工具,您可以直接用 「code . 」的方式进入线上编辑器 ( 就像地端使用 VSCode 一般 )

执行之后,就会看到类似下图一般的一个简洁的线上编辑器( 蓝色区域 ),让您可以很方便地来维护放在 Cloud Shell 内的档案。另外右上角 (红色区域) 也可以让您来进行存档和关闭的选项。

 

这里跟在 Windows 下执行 PowerShell 的方式有点不同,您把档案当成 Linux 的 Shell Script 去执行就可以了,因此只要使用「./createvm.ps1」就可以了

基本上这样就可以顺利执行了。而我在测试的时候,原本都没有什么问题,后来把整个脚本写好之后,一值会有失败,原本以为是自己脚本哪里写错了,后来查看一下原来是虚拟核心数的限制,一般来说Azure 预设订阅下的虚拟核心数是20 ,因此如果您会需要超过这个限制的话,那么就要先开一个Ticker ( https://portal.azure.com/#create/Microsoft.Support ),请微软的技术窗口协助您将限制给放大。

所有 VM 都建立好了

透過 Azure Portal 也可以看到我們用腳本建立的相關 VM 都被建立起來了

同样的也是使用腳本來執行 Start-AzVM

相对的如果要关闭,也可以同样的方式来呼叫Stop-AzVM 来进行,但要注意的是不要忘记加入-Force 的参数,否则你放到背景去执行,他会一值等你确认是否要关闭,就会卡在那里了

posted @ 2020-01-09 10:23  kamigao  阅读(478)  评论(0编辑  收藏  举报