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

(0)

相关推荐

  • Powershell实现编写和运行脚本

    一个Powershell仅仅是一个包含Powershell代码的文本文件.如果这个文本文件执行,Powershell解释器会逐行解释并执行它的的语句.Powershell脚本非常像以前CMD控制台上的批处理文件.您可以通过非常简单的文本编辑工具创建Powershell脚本. 通过重定向创建脚本 如果您的脚本不是很长,您甚至可以直接在控制台中要执行的语句重定向给一个脚本文件. PS E:> '"Hello,Powershell Script"' > MyScript.ps1

  • Windows Powershell 介绍和安装

    Powershell 是运行在windows机器上实现系统和应用程序管理自动化的命令行脚本环境.你可以把它看成是命令行提示符cmd.exe的扩充,不对,应当是颠覆. powershell需要.NET环境的支持,同时支持.NET对象.微软之所以将Powershell 定位为Power,并不是夸大其词,因为它完全支持对象.其可读性,易用性,可以位居当前所有shell之首. 当前powershell有四版本,分别为1.0,2.0,3.0 ,4.0 如果您的系统是window7或者Windows Ser

  • PowerShell中使用Get-Date获取日期时间并格式化输出的例子

    在PowerShell中有一个Get-Date的cmdlet,使用它可以直接返回当前的日期和时间.使用-Format参数可以返回当前的年.月.日.时.分.秒等. Get-Date的直接使用 在PowerShell中直接调用Get-Date,可以返回当前的日期和时间,包括年.月.日.时.分.秒.举例如下: 复制代码 代码如下: PS C:\Users\zhanghong> Get-Date 2013年9月9日 22:26:56 Write-Host中使用Get-Date 注意:在Write-Hos

  • PowerShell 入门基础教程

    Windows PowerShell 是专为系统管理员设计的新 Windows 命令行外壳程序.该外壳程序包括交互式提示和脚本环境,两者既可以独立使用也可以组合使用. 现在win2008,win7都集成了PowerShell,系统不带PowerShell可以自行到官方下载安装即可. 下载地址:http://www.jb51.net/jiaoben/67200.html 解读: 1.什么是交互式提示? 答:交互式提示就像打开一个cmd窗口,在里面执行一个ping命令一样,它会动态的输入结果.也可以

  • 25个常用PowerShell命令总结

    尽管Windows PowerShell已经出现一段时间了,习惯命令行的管理员可能对了解PowerShell功能的基础很感兴趣. 下面我们看看能由Windows PowerShell完成的最常见的25个任务.不止是这些任务很简单,显示语句的命令架构和其他PowerShell命令也很简单.掌握好这些基本命令是成为PowerShell专家的必经之路. 入门级别 1. 像文件系统那样操作Windows Registry--cd hkcu: 2. 在文件里递回地搜索某个字符串--dir –r | sel

  • 浅谈CMD和win powershell的区别

    cmd是和powershell都可以做命令行交互,批处理和powershell脚本功能也相当. 我不知道你怎么理解cmd,但下面是powershell是基于.net的,只要你足够了解.net,你可以使用她做任何你想做的事情. Windows PowerShell 是专为系统管理员设计的新 Windows 命令行 shell.Windows PowerShell 包括交互式提示和脚本环境,两者既可以独立使用也可以组合使用. 与接受和返回文本的大多数 shell 不同,Windows PowerSh

  • PowerShell读取文件内容、替换文件内容、读取限定行的例子

    我只能说,使用PowerShell来读取文本文件实在是一件太简单的事情了. Get-Content,获取指定位置的项的内容. 语法:Get-Content [-Path] <文件路径> [-Path]由方括号引起,表示可以写,也可以不写:不写则默认后面是文件路径,写了就指名道姓的说后面是文件路径. 直接运行这样一个命令,PowerShell将会把文件的内容输出到控制台上,如果你是想看看文件的内容,那这样做就Perfect! 但有时候,你想玩点高难度的运作--想把文件翻开来对里面的内容进行修改,

  • Win8系统中使用PowerShell安装APPX应用命令介绍

    在Windows 8平台上,可以安装最新的LOB(业务线)应用程序,即后缀为.APPX的程序.APPX程序一般都需要开发者提交给Windows应用商店,由它审核后统一发布,其他用户通过应用商店下载安装.如果我们自己开发的一个APPX程序,我只想给自己或少部分人用,那也不必走应用商店的复杂流程,可以自己安装在自己的设备上. 本文就介绍如何使用PowerShell来安装APPX程序.当然,这里要注意,既然是APPX程序,那一定是Windows 8系统:既然是Windows 8,那一定是PowerSh

  • Windows PowerShell是啥?看完本文你就懂它了

    引子 一直很羡慕Linux的命令提示符(当然他们叫Shell).正则表达式,管道,各种神奇的命令,组合起来就能高效完成很多复杂的任务.效率实在是高.流了n年的哈喇子以后,终于有幸用上了Win7,邂逅了cmd的升级版:Windows PowerShell.从此暗爽无比,原来Windows下也有这样的利器呀~ 看看下面的Windows脚本,不到15行有效代码.在Win7下只要右击脚本文件,选择Run with PowerShell,就会自动找到最占内存的10个进程,然后将它们占用的内存画成一个三维饼

  • 使用 powershell 创建虚拟机

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

  • PowerShell创建Byte数组例子

    PowerShell中,如果需要可以创建字节数组,即传说中的Byte[]类型的数组.当然,它属于强类型的数组. 使用如下语句创建一个字节数组,数组元素的个数为100个. 复制代码 代码如下: $byteArray = New-Object Byte[] 100 创建一个字节数组,数组元素个数为100个,每个数组元素的值为0xFF. 复制代码 代码如下: $byteArray = [Byte[]] (,0xFF * 100) 这里要解释一下,Byte[]表示字节类型,而把Byte[]再用中括号括起

  • 在VMware上创建虚拟机及安装Redhat Linux操作系统(图文教程)

    在VMware上如何创建虚拟机以及安装Redhat Linux操作系统创建虚拟机(本人使用的是VMware pro 15) ( 1)点击Create a New Virtual Machine (2)选择自定义,然后点击next (3)出现以下界面,不做任何修改,点击next (4)选择稍后安装操作系统(s),点击next (5)客户机操作系统选择Linux,版本选择Red Hat Enterprise Linux 7 64-bit(可根据自己的实际镜像文件版本选择适合的版本),然后点击next

  • shell脚本自动化创建虚拟机的基本配置之tomcat--mysql--jdk--maven

    自动化shell脚本 ps:此处安装的jdk,maven,tomcat均在/opt目录下,如需其他目录或者其他版本,可根据需要改动shell脚本即可. ps:所有代码全部手敲,已亲测能够使用,全部分享出来. 一:虚拟机初始化 创建shell脚本,把命令放进.sh脚本里,./xx.sh运行此脚本可以完成虚拟机初始化 #!/bin/bash #1.改变机器名 hostnamectl set-hostname $1 #2.打通ip地址 sed -i 's/dhcp/static/' /etc/sysc

  • Java基础之创建虚拟机对象的过程详细总结

    一.对象的创建 1.1 new 类名 虚拟机遇到一条new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已经被加载.解析和初始化过.如果没有,先执行相应的类加载过程. 1.2 分配内存 虚拟机为新生对象分配内存.对象所需内存大小在类加载完成后就可以确定,为对象分配内存等同于把一块确定大小的内存从Java堆中划分出来. (1)内存分配的方式有两种: ① 指针碰撞: java堆如果规整,一边是用过的内存,一边是空闲的内存,中间一个指针作为边界指示

  • Hyper-V创建虚拟机示例图文教程

    下面的教程在win2008与win2012 都可以 以上就完成了hyper-v虚拟机的创建工作.

  • Windows Powershell 创建数组

    在Powershell中创建数组可以使用逗号. PS C:Powershell> $nums=2,0,1,2 PS C:Powershell> $nums 2 0 1 2 对于连续的数字数组可以使用一个更快捷的方法 PS C:Powershell> $nums=1..5 PS C:Powershell> $nums 1 2 3 4 5 数组的多态 象变量一样如果数组中元素的类型为弱类型,默认可以存储不同类型的值. PS C:Powershell> $array=1,"

  • Powershell创建数组正确、更快的方法

    通常当新的对象添加到一个数组中,根据经验你最担心其性能问题.下面第一个例子将告诉你一个错误的操作方法: 复制代码 代码如下: Measure-Command {   $ar = @()     for ($x=0; $x -lt 10000; $x++)   {     $ar += $x   } } 在这个循环中,这个数组通过符号"+="增加了许多新的对象.这样做会需要很长时间,因为在你改变其大小时Powershell每次需要去创造一个新的数组. 下面将有一个非常快的办法-Array

  • Powershell创建简洁的HTML报告例子

    支持所有版本 把结果变成复杂的HTML报告,一个简单的方法是定义三个脚本块:一个用作HTML的开头文档,一个用作它的结尾,还有一个是存放动态对象的表格 接着,把这些脚本块传入到ForEach-Object,分别对应脚本的开始块.中间要处理的动态列表块和结束代码块. 下面有个简单的例子阐述如何用它创造一个服务报告: 复制代码 代码如下: $path = "$env:temp\report.hta"   $beginning = {  @'     <html>     <

  • KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法

    一.KVM简介 KVM(名称来自英语:Kernel-basedVirtual Machine的缩写,即基于内核的虚拟机),是一种用于Linux内核中的虚拟化基础设施,可以将Linux内核转化为一个hypervisor.KVM在2007年2月被导入Linux 2.6.20核心中,以可加载核心模块的方式被移植到FreeBSD及illumos上. KVM在具备Intel VT或AMD-V功能的x86平台上运行.它也被移植到S/390,PowerPC与IA-64平台上.在Linux内核3.9版中,加入A

随机推荐