Azure PowerShell 模块用于从 PowerShell 命令行或脚本创建和管理 Azure 资源。 本指南详细介绍了如何使用 Azure PowerShell 模块创建虚拟机。

在进行与 azure 相关的自动化过程中,创建虚拟主机是避不开的操作。由于系统本身的复杂性,很难用一两条简单的命令完成虚拟主机的创建。所以专门写一篇文章来记录使用 PowerShell 在 azure 上创建虚拟主机(Ubuntu 服务器)。
虚拟主机虚拟主机需要与其他的一些基础性组件关联在一起才能提供可用的服务,这些组件包括:网卡、public IP 地址、虚拟网络、网络安全组、存储等。下图包含了新建一个虚机所需要的其他组件:

也就是说在我们创建虚机的同时也要把这些组件一一的创建出来。

定义变量

我们希望今后可以重用这个脚本,所以把用到的变量全都放在一起便于修改或使用脚本的参数进行初始化:

$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"

希望没有吓到你。没错!就是需要这么多的变量,这里先不解释,在后面用到一个说一个。

创建登录虚机的凭据

通过这个脚本创建的虚机默认会创建一个用户,你需要指定用户的名称和登录密码(我们的创建的用户通过公钥认证登录,这个密码并不真正使用)。通过用户名和密码创建凭据对象:

$securePassword = ConvertTo-SecureString $userPassword -AsPlainText -Force
$userCred = New-Object System.Management.Automation.PSCredential ($userName, $securePassword)

创建 Resource Group

创建一个新的 Resource Group,这个虚机及其所有相关的组件都归属于同一个 Resource Group:

New-AzureRmResourceGroup -Name $rgName -Location $rgLocation
在参数 Location 中指定 Resource Group 的位置为东亚(访问速度比较快)。

创建虚拟网络

接下来创建与虚拟网络。先创建一个子网的配置:

$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
最后为主机创建一个可以外网访问的 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
创建 Storage Account

虚机的磁盘文件是以 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 自动登录》一文中有详细的介绍,有兴趣的朋友可以参考。

最新资讯
小米美团拼多多,“MMP”们正呼唤互联网下半场的新秩序

小米美团拼多多,“MMP

下半场还有突围机会吗?越来越“无聊”的互联网格局还有
欧盟巨额罚款风波:安卓要收费、闭源恐难于上青天

欧盟巨额罚款风波:安卓

安卓今日的格局已非谷歌一家能左右,那些依赖安卓生态的
有多少人工智能靠“人工”强行“智能”?

有多少人工智能靠“人

使用人工的做法假装智能已经不是第一次了。
这一次,我不打算站Google

这一次,我不打算站Goog

不管别人怎么争执,最没资格插嘴的是中国人。
贝叶斯大脑:预测编码理论可启发AI构建和人类意识

贝叶斯大脑:预测编码

在认知学领域一个有争议的理论认为,感知、运动控制、记
史上最严重数据车祸:通用丰田特斯拉统统中招

史上最严重数据车祸:通

100多家车厂,从通用汽车、菲亚特克莱斯勒、福特、丰田,
最新文章
PowerShell使用match操作符来筛选数组

PowerShell使用match

本文介绍PowerShell中使用match操作符,配合正则表达式
PowerShell 语音计算器实现代码

PowerShell 语音计算

带中文发音功能的计算器程序,支持鼠标和小键盘输入,支持
通过DNS TXT记录执行powershell

通过DNS TXT记录执行p

这篇文章主要介绍了通过DNS TXT记录执行powershell的
如何防范PowerShell代码注入漏洞绕过受限语言模式

如何防范PowerShell代

这篇文章主要介绍了如何防范PowerShell代码注入漏洞绕
PowerShell管道入门必看篇(管道例子大全)

PowerShell管道入门必

下面小编就为大家带来一篇PowerShell管道入门必看篇(
使用 powershell 创建虚拟机

使用 powershell 创建

Azure PowerShell 模块用于从 PowerShell 命令行或脚