在進行與 azure 相關(guān)的自動化過程中,創(chuàng)建虛擬主機是避不開的操作。由于系統(tǒng)本身的復雜性,很難用一兩條簡單的命令完成虛擬主機的創(chuàng)建。所以專門寫一篇文章來記錄使用 PowerShell 在 azure 上創(chuàng)建虛擬主機(Ubuntu 服務(wù)器)。
虛擬主機虛擬主機需要與其他的一些基礎(chǔ)性組件關(guān)聯(lián)在一起才能提供可用的服務(wù),這些組件包括:網(wǎng)卡、public IP 地址、虛擬網(wǎng)絡(luò)、網(wǎng)絡(luò)安全組、存儲等。下圖包含了新建一個虛機所需要的其他組件:
也就是說在我們創(chuàng)建虛機的同時也要把這些組件一一的創(chuàng)建出來。
定義變量
我們希望今后可以重用這個腳本,所以把用到的變量全都放在一起便于修改或使用腳本的參數(shù)進行初始化:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
$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" |
希望沒有嚇到你。沒錯!就是需要這么多的變量,這里先不解釋,在后面用到一個說一個。
創(chuàng)建登錄虛機的憑據(jù)
通過這個腳本創(chuàng)建的虛機默認會創(chuàng)建一個用戶,你需要指定用戶的名稱和登錄密碼(我們的創(chuàng)建的用戶通過公鑰認證登錄,這個密碼并不真正使用)。通過用戶名和密碼創(chuàng)建憑據(jù)對象:
1
2
|
$securePassword = ConvertTo-SecureString $userPassword -AsPlainText -Force $userCred = New-Object System.Management.Automation.PSCredential ( $userName , $securePassword ) |
創(chuàng)建 Resource Group
創(chuàng)建一個新的 Resource Group,這個虛機及其所有相關(guān)的組件都歸屬于同一個 Resource Group:
1
|
New -AzureRmResourceGroup -Name $rgName -Location $rgLocation |
創(chuàng)建虛擬網(wǎng)絡(luò)
接下來創(chuàng)建與虛擬網(wǎng)絡(luò)。先創(chuàng)建一個子網(wǎng)的配置:
1
|
$subnetConfig = New -AzureRmVirtualNetworkSubnetConfig -Name $subnetConfigName -AddressPrefix 192.168.1.0/24 |
1
2
|
$vnet = New -AzureRmVirtualNetwork -ResourceGroupName $rgName -Location $rgLocation ` -Name $vnetName -AddressPrefix 192.168.0.0/16 -Subnet $subnetConfig |
1
2
3
|
$pip = New -AzureRmPublicIpAddress -ResourceGroupName $rgName -Location $rgLocation ` -AllocationMethod Static -IdleTimeoutInMinutes 4 ` -Name $pipName |
需要先配置一個允許訪問 22 端口的規(guī)則:
1
2
3
|
$nsgRule22 = New -AzureRmNetworkSecurityRuleConfig -Name $nsgRule22Name -Protocol Tcp ` -Direction Inbound -Priority 200 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * ` -DestinationPortRange 22 -Access Allow |
1
2
|
$nsg = New -AzureRmNetworkSecurityGroup -ResourceGroupName $rgName -Location $rgLocation ` -Name $nsgName -SecurityRules $nsgRule22 |
主機還缺一張網(wǎng)卡,所以為主機創(chuàng)建一個虛擬網(wǎng)卡:
1
2
|
$nic = New -AzureRmNetworkInterface -Name $interfaceName -ResourceGroupName $rgName -Location $rgLocation ` -SubnetId $vnet .Subnets[0].Id -PublicIpAddressId $pip .Id -NetworkSecurityGroupId $nsg .Id |
虛機的磁盤文件是以 blob 的形式存放在 azure 的存儲中的,所以我們需要創(chuàng)建一個 StorageAccount 來存儲磁盤文件:
1
|
$storageAccount = New -AzureRmStorageAccount -ResourceGroupName $rgName -Name $storageName -Type $storageType -Location $rgLocation |
下面定義磁盤文件的存放位置和名稱:
1
|
$oSDiskUri = $storageAccount .PrimaryEndpoints.Blob.ToString() + "vhds/" + $oSDiskName + ".vhd" |
下面創(chuàng)建虛機相關(guān)的配置:
1
2
3
4
5
|
$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 |
1
|
$sshPublicKey = "nick's ssh public key" |
1
|
Add -AzureRmVMSshPublicKey -VM $vmconfig -KeyData $sshPublicKey -Path "/home/$userName/.ssh/authorized_keys" |
1
|
New -AzureRmVM -ResourceGroupName $rgName -Location $rgLocation -VM $vmConfig |
在 azure 上執(zhí)行操作需要用戶先進行登錄,那么在 PowerShell 腳本中該如何做呢?
筆者在《Azure 基礎(chǔ):用 PowerShell 自動登錄》一文中有詳細的介紹,有興趣的朋友可以參考。
原文鏈接:http://www.cnblogs.com/sparkdev/p/7725965.html