在进行与 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 自动登陆》一文中有详细的介绍,有兴趣的朋友能够参考。