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

最新资讯
后直播时代网红求生之道:打赏不够,广告、带货来凑

后直播时代网红求生之

屏幕这端,是独自面对麦克风的“艺人”;屏幕那一端,是4亿
还把苹果发布会当“科技春晚”看,你就输了

还把苹果发布会当“科

今年苹果秋季发布会有个非常主流的评论方向,叫“贵成为
小程序未必是支付宝的理想生态

小程序未必是支付宝的

支付宝的困扰在于如果小程序的目标是骚扰并牵制微信,那
人民不需要这样的iPhone

人民不需要这样的iPho

你大爷还是你大爷。
外媒评iPhone汇总:继续价格抬高战略 单价更贵更赚钱

外媒评iPhone汇总:继

手机是苹果的利润之源,虽然设计没有太大变化,不过市场普
在四川深山里做自媒体:田间地头产10万+ 月收入过万

在四川深山里做自媒体

这是农村自媒体的黄金时期,是农村人翻身的另一个机会,也
最新文章
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 命令行或脚