在進行與 azure 相關的自動化過程當中,建立虛擬主機是避不開的操做。因爲系統自己的複雜性,很難用一兩條簡單的命令完成虛擬主機的建立。因此專門寫一篇文章來記錄使用 PowerShell 在 azure 上建立虛擬主機(Ubuntu 服務器)。
虛擬主機虛擬主機須要與其餘的一些基礎性組件關聯在一塊兒才能提供可用的服務,這些組件包括:網卡、public IP 地址、虛擬網絡、網絡安全組、存儲等。下圖包含了新建一個虛機所須要的其餘組件:html
也就是說在咱們建立虛機的同時也要把這些組件一一的建立出來。安全
咱們但願從此能夠重用這個腳本,因此把用到的變量全都放在一塊兒便於修改或使用腳本的參數進行初始化:服務器
$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"
但願沒有嚇到你。沒錯!就是須要這麼多的變量,這裏先不解釋,在後面用到一個說一個。網絡
經過這個腳本建立的虛機默認會建立一個用戶,你須要指定用戶的名稱和登陸密碼(咱們的建立的用戶經過公鑰認證登陸,這個密碼並不真正使用)。經過用戶名和密碼建立憑據對象:ssh
$securePassword = ConvertTo-SecureString $userPassword -AsPlainText -Force $userCred = New-Object System.Management.Automation.PSCredential ($userName, $securePassword)
建立一個新的 Resource Group,這個虛機及其全部相關的組件都歸屬於同一個 Resource Group:spa
New-AzureRmResourceGroup -Name $rgName -Location $rgLocation
在參數 Location 中指定 Resource Group 的位置爲東亞(訪問速度比較快)。操作系統
接下來建立與虛擬網絡。先建立一個子網的配置:code
$subnetConfig = New-AzureRmVirtualNetworkSubnetConfig -Name $subnetConfigName -AddressPrefix 192.168.1.0/24
而後建立具備一個子網的虛擬網絡:htm
$vnet = New-AzureRmVirtualNetwork -ResourceGroupName $rgName -Location $rgLocation ` -Name $vnetName -AddressPrefix 192.168.0.0/16 -Subnet $subnetConfig
最後爲主機建立一個能夠外網訪問的 public IP:對象
$pip = New-AzureRmPublicIpAddress -ResourceGroupName $rgName -Location $rgLocation ` -AllocationMethod Static -IdleTimeoutInMinutes 4 ` -Name $pipName
須要先配置一個容許訪問 22 端口的規則:
$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
主機還缺一張網卡,因此爲主機建立一個虛擬網卡:
$nic = New-AzureRmNetworkInterface -Name $interfaceName -ResourceGroupName $rgName -Location $rgLocation ` -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $nsg.Id
虛機的磁盤文件是以 blob 的形式存放在 azure 的存儲中的,因此咱們須要建立一個 StorageAccount 來存儲磁盤文件:
$storageAccount = New-AzureRmStorageAccount -ResourceGroupName $rgName -Name $storageName -Type $storageType -Location $rgLocation
下面定義磁盤文件的存放位置和名稱:
$oSDiskUri = $storageAccount.PrimaryEndpoints.Blob.ToString() + "vhds/" + $oSDiskName + ".vhd"
下面建立虛機相關的配置:
$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
咱們建立的虛機操做系統爲 Ubuntu Server 16.04-LTS,禁止使用用戶名密碼的方式登陸。要讓用戶可以經過公鑰的方式登陸必須提供用戶的公鑰:
$sshPublicKey = "nick's ssh public key"
下面的命令會把你提供的公鑰寫入到用戶的 authorized_keys 文件中:
Add-AzureRmVMSshPublicKey -VM $vmconfig -KeyData $sshPublicKey -Path "/home/$userName/.ssh/authorized_keys"
下面的命令真正的在 azure 上建立虛機:
New-AzureRmVM -ResourceGroupName $rgName -Location $rgLocation -VM $vmConfig
在 azure 上執行操做須要用戶先進行登陸,那麼在 PowerShell 腳本中該如何作呢?
筆者在《Azure 基礎:用 PowerShell 自動登陸》一文中有詳細的介紹,有興趣的朋友能夠參考。