使用 powershell 創(chuàng)建虛擬機(jī)
在進(jìn)行與 azure 相關(guān)的自動(dòng)化過(guò)程中,創(chuàng)建虛擬主機(jī)是避不開(kāi)的操作。由于系統(tǒng)本身的復(fù)雜性,很難用一兩條簡(jiǎn)單的命令完成虛擬主機(jī)的創(chuàng)建。所以專(zhuān)門(mén)寫(xiě)一篇文章來(lái)記錄使用 PowerShell 在 azure 上創(chuàng)建虛擬主機(jī)(Ubuntu 服務(wù)器)。
虛擬主機(jī)虛擬主機(jī)需要與其他的一些基礎(chǔ)性組件關(guān)聯(lián)在一起才能提供可用的服務(wù),這些組件包括:網(wǎng)卡、public IP 地址、虛擬網(wǎng)絡(luò)、網(wǎng)絡(luò)安全組、存儲(chǔ)等。下圖包含了新建一個(gè)虛機(jī)所需要的其他組件:

也就是說(shuō)在我們創(chuàng)建虛機(jī)的同時(shí)也要把這些組件一一的創(chuàng)建出來(lái)。
定義變量
我們希望今后可以重用這個(gè)腳本,所以把用到的變量全都放在一起便于修改或使用腳本的參數(shù)進(jìn)行初始化:
$rgName = "vmpool" $rgLocation = "East Asia" $subnetConfigName = $rgName + "subnet" $vnetName = $rgName + "vnet" $vmName = "vmxman" $pipName = $vmName + "pip" $nsgRule22Name = "nsgRule22" $nsgName = $rgName + "nsg" $interfaceName = $vmName + "nic" $storageName = $rgName + "storage" $storageType = "Standard_GRS" $oSDiskName = $vmName + "OSDisk" $vmSize = "Standard_D1" $vmVersion = "16.04-LTS" $userName = "nick" $userPassword = "123456"
希望沒(méi)有嚇到你。沒(méi)錯(cuò)!就是需要這么多的變量,這里先不解釋?zhuān)诤竺嬗玫揭粋€(gè)說(shuō)一個(gè)。
創(chuàng)建登錄虛機(jī)的憑據(jù)
通過(guò)這個(gè)腳本創(chuàng)建的虛機(jī)默認(rèn)會(huì)創(chuàng)建一個(gè)用戶(hù),你需要指定用戶(hù)的名稱(chēng)和登錄密碼(我們的創(chuàng)建的用戶(hù)通過(guò)公鑰認(rèn)證登錄,這個(gè)密碼并不真正使用)。通過(guò)用戶(hù)名和密碼創(chuàng)建憑據(jù)對(duì)象:
$securePassword = ConvertTo-SecureString $userPassword -AsPlainText -Force $userCred = New-Object System.Management.Automation.PSCredential ($userName, $securePassword)
創(chuàng)建 Resource Group
創(chuàng)建一個(gè)新的 Resource Group,這個(gè)虛機(jī)及其所有相關(guān)的組件都?xì)w屬于同一個(gè) Resource Group:
New-AzureRmResourceGroup -Name $rgName -Location $rgLocation
創(chuàng)建虛擬網(wǎng)絡(luò)
接下來(lái)創(chuàng)建與虛擬網(wǎng)絡(luò)。先創(chuàng)建一個(gè)子網(wǎng)的配置:
$subnetConfig = New-AzureRmVirtualNetworkSubnetConfig -Name $subnetConfigName -AddressPrefix 192.168.1.0/24
$vnet = New-AzureRmVirtualNetwork -ResourceGroupName $rgName -Location $rgLocation `
-Name $vnetName -AddressPrefix 192.168.0.0/16 -Subnet $subnetConfig
$pip = New-AzureRmPublicIpAddress -ResourceGroupName $rgName -Location $rgLocation `
-AllocationMethod Static -IdleTimeoutInMinutes 4 `
-Name $pipName
需要先配置一個(gè)允許訪問(wèn) 22 端口的規(guī)則:
$nsgRule22 = New-AzureRmNetworkSecurityRuleConfig -Name $nsgRule22Name -Protocol Tcp ` -Direction Inbound -Priority 200 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * ` -DestinationPortRange 22 -Access Allow
$nsg = New-AzureRmNetworkSecurityGroup -ResourceGroupName $rgName -Location $rgLocation ` -Name $nsgName -SecurityRules $nsgRule22
主機(jī)還缺一張網(wǎng)卡,所以為主機(jī)創(chuàng)建一個(gè)虛擬網(wǎng)卡:
$nic = New-AzureRmNetworkInterface -Name $interfaceName -ResourceGroupName $rgName -Location $rgLocation ` -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $nsg.Id
虛機(jī)的磁盤(pán)文件是以 blob 的形式存放在 azure 的存儲(chǔ)中的,所以我們需要?jiǎng)?chuàng)建一個(gè) StorageAccount 來(lái)存儲(chǔ)磁盤(pán)文件:
$storageAccount = New-AzureRmStorageAccount -ResourceGroupName $rgName -Name $storageName -Type $storageType -Location $rgLocation
下面定義磁盤(pán)文件的存放位置和名稱(chēng):
$oSDiskUri = $storageAccount.PrimaryEndpoints.Blob.ToString() + "vhds/" + $oSDiskName + ".vhd"
下面創(chuàng)建虛機(jī)相關(guān)的配置:
$vmConfig = New-AzureRmVMConfig -VMName $vmName -VMSize $vmSize | `
Set-AzureRmVMOperatingSystem -Linux -ComputerName $vmName -Credential $userCred -DisablePasswordAuthentication | `
Set-AzureRmVMSourceImage -PublisherName Canonical -Offer UbuntuServer -Skus $vmVersion -Version latest | `
Add-AzureRmVMNetworkInterface -Id $nic.Id | `
Set-AzureRmVMOSDisk -VhdUri $oSDiskUri -CreateOption FromImage
$sshPublicKey = "nick's ssh public key"
Add-AzureRmVMSshPublicKey -VM $vmconfig -KeyData $sshPublicKey -Path "/home/$userName/.ssh/authorized_keys"
New-AzureRmVM -ResourceGroupName $rgName -Location $rgLocation -VM $vmConfig
在 azure 上執(zhí)行操作需要用戶(hù)先進(jìn)行登錄,那么在 PowerShell 腳本中該如何做呢?
筆者在《Azure 基礎(chǔ):用 PowerShell 自動(dòng)登錄》一文中有詳細(xì)的介紹,有興趣的朋友可以參考。
相關(guān)文章
PowerShell包含另一個(gè)腳本文件和獲取當(dāng)前腳本所在目錄的方法例子
這篇文章主要介紹了PowerShell包含另一個(gè)腳本文件和獲取當(dāng)前腳本所在目錄的方法例子,需要的朋友可以參考下2014-08-08
PowerShell創(chuàng)建Byte數(shù)組例子
這篇文章主要介紹了PowerShell創(chuàng)建Byte數(shù)組例子,Byte數(shù)組即字節(jié)數(shù)組,它是一種強(qiáng)類(lèi)型的數(shù)組,需要的朋友可以參考下2014-08-08
在cmd中直接運(yùn)行PowerShell腳本文件的方法
這篇文章主要介紹了在cmd中直接運(yùn)行PowerShell腳本文件的方法,本文給出了兩個(gè)小技巧實(shí)現(xiàn)在cmd中直接運(yùn)行PowerShell腳本,需要的朋友可以參考下2014-12-12
Windows Powershell Switch 語(yǔ)句
如果語(yǔ)句中有多路分支,使用IF-ELSEIF-ELSE不友好,可以使用Switch,看起來(lái)比較清爽一點(diǎn)。2014-10-10
PowerShell中使用Get-Date獲取日期時(shí)間并格式化輸出的例子
這篇文章主要介紹了PowerShell中使用Get-Date獲取日期時(shí)間并格式化輸出的例子,本文講解了直接調(diào)用Get-Date、在Write-Host中使用Get-Date、格式化輸出的方法,需要的朋友可以參考下2014-08-08
使用HTTP api簡(jiǎn)單的遠(yuǎn)程執(zhí)行PowerShell腳本
為了你能非常簡(jiǎn)單的遠(yuǎn)程執(zhí)行PoweShell腳本,使用REST API是一個(gè)很好的選擇,因?yàn)楝F(xiàn)在許多流行的編程語(yǔ)言都可以簡(jiǎn)單的執(zhí)行HTTP的GET操作。2014-10-10
PowerShell數(shù)組結(jié)合switch語(yǔ)句產(chǎn)生的奇特效果介紹
這篇文章主要介紹了PowerShell數(shù)組結(jié)合switch語(yǔ)句產(chǎn)生的奇特效果介紹,產(chǎn)生了類(lèi)似枚舉的效果,需要的朋友可以參考下2014-08-08
Windows Powershell 進(jìn)行數(shù)學(xué)運(yùn)算
在Windows PowerShell中, 使用數(shù)學(xué)運(yùn)算符來(lái)進(jìn)行數(shù)學(xué)運(yùn)算,數(shù)學(xué)運(yùn)算符允許你在命令參數(shù)中計(jì)算數(shù)值. 你可以使用一個(gè)或者多個(gè)運(yùn)算符進(jìn)行加減乘除法, 也可以返回除法的余數(shù)(模). 包含這些計(jì)算的參數(shù), 將計(jì)算結(jié)果作為參數(shù)值. 命令就像處理其他類(lèi)型參數(shù)一樣, 來(lái)處理參數(shù)值.2014-08-08

