在进行与 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 = ""

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

创建登录虚机的凭据

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

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

Azure 基础:使用 powershell 创建虚拟机的更多相关文章

  1. 在Azure上通过Powershell创建多Interface的Cisco CSR路由器

    前面通过Json的Template在Azure上创建了Cisco的CSR路由器.但那个Json的template只支持1块网卡.如果需要多网卡的Cisco CSR路由器,可以改上篇文章中提到的Json ...

  2. Azure China (8) 使用Azure PowerShell创建虚拟机,并设置固定Virtual IP Address和Private IP

    <Windows Azure Platform 系列文章目录> 本文介绍的是由世纪互联运维的Windows Azure China. 相比于Global Azure (http://www ...

  3. Azure PowerShell 创建虚拟机

    # 指定订阅名称$subscriptionName="订阅名称"# 指定云服务名称$serviceName="云服务名称"# 指定用来保存虚拟机VHD的存储$s ...

  4. Azure PowerShell (5) 使用Azure PowerShell创建简单的Azure虚拟机和Linux虚拟机

    <Windows Azure Platform 系列文章目录> 本文介绍的是国外的Azure Global.如果是国内由世纪互联运维的Azure China,请参考这篇文档: Azure ...

  5. Azure 基础:使用 powershell 创建虚拟网络

    什么是虚拟网络 虚拟网络是您的网络在 Azure 云上的表示形式.您可以完全控制虚拟网络的 IP 地址.DNS 的设置.安全策略和路由表.您还可以更进一步,把虚拟网络划分为多个子网.然后用它们连接您的 ...

  6. Windows Azure系列公开课 - 第三课:创建虚拟机 (基础篇)

    Windows Azure微软智能云平台主要提供四大类服务:计算服务(Compute),数据服务 (Data Services) ,应用服务 (App Services) ,网络服务(Network) ...

  7. ARM 环境下使用azure powershell 从远程blob中拉去vhd 并创建虚拟机

    最近需要从指定公共访问的blob中复制vhd到自己的订阅存储账户,并使用vhd创建AZURE ARM虚拟机(非经典版),而且在portal.azure.cn中无法实现虚拟机映像创建等功能,于是自己使用 ...

  8. Azure Powershell blob中指定的vhd创建虚拟机

    #此脚本用于 Azure 存储账户中已有 vhd 镜像文件创建虚拟机,一般用于做好镜像测试 #----------------------------------------------------- ...

  9. Azure PowerShell 在ARM环境下使用指定 vhd(本地化后的磁盘) 来创建虚拟机

    #此脚本用于 Azure 存储账户中已有 vhd 镜像文件创建虚拟机,一般用于做好镜像测试 #----------------------------------------------------- ...

随机推荐

  1. 201521123106 《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  2. 201521123106 《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1. ...

  3. 201521123018 《Java程序设计》第10周学习总结

    1. 本章学习总结 你对于本章知识的学习总结 2. 书面作业 一.inally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 答: 4-2中 ...

  4. Hadoop面试题目

    1.Hadoop集群可以运行的3个模式? 单机(本地)模式 伪分布式模式 全分布式模式 2.  单机(本地)模式中的注意点? 在单机模式(standalone)中不会存在守护进程,所有东西都运行在一个 ...

  5. 关于Visio Studio 2012使用Nuget获取Sqlite驱动包报错:“System.Data.SQLite.EF6”的架构版本与 NuGet 的版本 2.0.30625.9003 不兼容

    背景 笔者的VS2012版本比较老旧,是几年以前下载的.平时添加三方包和驱动包都是手动添加.后来了解到有Nuget这个工具,如获至宝.可是在使用过程中却出了不少问题. 最初,笔者尝试使用Nuget添加 ...

  6. SpringBoot开发案例之mail中文附件乱码

    前一段时间做过一个邮件发送的服务,以前大体都测试过,文本.图片.附件都是没有问题的,可有同事反应发送的附件名称有中文乱码,类似如下截图展示: 咋一看不像乱码,抱着试试看的态度,为MimeMessage ...

  7. jenkins~集群分发功能的具体实现

    前一讲主要说了jenkins分发的好处<jenkins~集群分发功能和职责处理>,它可以让具体的节点干自己具体的事,比如windows环境下的节点,它只负责编译,发布windows的生态环 ...

  8. 一.把传统服务做成dubbo分布式服务架构的步骤

    1.把传统服务按照一定原则(根据项目的业务逻辑和场景)拆分成多个服务(主要服务是服务提供者和服务消费者,服务提供者或服务消费者的公共部分也可以拆分成其他服务,如公共DAO.公共工具类.公共实体,公共w ...

  9. Online Bayesian Probit Regression介绍之Factor Graph

    下面就开始讲讲概率图中的Factor Graph.概率图博大精深,非我等鼠辈能够完全掌握,我只是通过研究一些通用的模型,对概率图了解了一点皮毛.其实我只是从概率这头神兽身上盲人摸象地抓掉几根毛,我打算 ...

  10. 五年.net程序员转型Java之路

    大学毕业后笔者进入一家外企,做企业CRM系统开发,那时候开发效率最高的高级程序语言,毫无疑问是C#.恰逢公司也在扩张,招聘了不少.net程序员,笔者作为应届生,也乐呵呵的加入到.net程序员行列中. ...