[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 的参数,否则你放到背景去执行,他会一值等你确认是否要关闭,就会卡在那里了