首先来说明一下为什么要写这个脚本,记得当初刚开始做私有云实验的时候,对Hyper-V的操作还不熟练,导致一遍又一遍的重新安装虚拟机,做私有云实验,安装OS和软件占据了我们大部分的时间,后来也是在51CTO的各个大神(九叔之类的)的博客里面逐渐熟悉了一些技术,了解到了VHD模板(差异磁盘)也逐渐掌握了差异磁盘的方法,当时以为环境都做快照,就能一劳永逸,相同的环境不需要再创建新的VM了,到现在想想,这个想法是挺不现实的,因为你要新的操作系统、新的演示环境、与以前的版本协作等等。。。

     后来,VM的数量越来越多,模板也越来多,重复的操作也就相应变多同。。。记得第一次做Azure Pack实验的时候,当场就有点怕了。。。一下子七八台虚拟机,心里的那个躁动啊!虽然整个流程比较简单,先准备VHD模板,接着根据VM创建相应的差异磁盘,然后再创建相应的VM,再把VHD附加到VM,还得连接到相应的虚拟交换机。。。一个两个还好,三四个也能接受,到了七八个,我就接受不了(主要是我比较懒)。。。于是下了个狠心想办法写了个批量创建VM的脚本。。。

这个图大家可以看的玩玩,Windows Azure Pack的架构图,仔细找找,会发现需要创建的VM太多了。。。

     其实,整个过程也比较简单,将我们手工完成的任务交给PowerShell来完成,我们只要定义好相应的参数信息就行了。

     看上面这个VM1,比如说我们要新建的这台VM1是4 vCPU、4GB内存、127GB硬盘,连接到vSwitch网络,如果用PS(PowerShell,以下简称PS)来完成这个操作,该如何进行呢?

我们先来做一件有意思的事情,如果用英语关键字来表示这个操作,大概是什么样的呢?

New Virtual Machine , 4 vCPU, 4GB Memory, 127GB Disk,  connect to vSwitch network

而在PS中的表现形式如下:

New-VHD  -Path D:\Hyper-v\Virtual Hard Disk\disk1.vhdx
New-VM -VHDPath D:\Hyper-v\Virtual Hard Disk\disk1.vhdx -MemoryStartupBytes 4GB -Name VM1 -SwitchName vSwitch
Set-VMProcessor -VMName VM1 -Count 4


      通过如上PS脚本,我们不难看出,PS脚本非常简单易懂,容易记忆,和英语本身的近似度很好,特别适合我们做运维的同学。

     当然,上述可实现我们的新建VM的需求,可是这样的脚本可用性不高,因为脚本中VM的配置不是"活"的,每次运行都只能够创建相同的VM,那怎么样才能活呢?是不是通过键盘交互会更好?其实,如果把刚刚的脚本做个简单的修改,就能够实现。

     任何一门编程语言都离不开变量,我们的PS当然也可以使用变量,在PS中定义一个新的变量只要在变量名称前面加上美元符号"$",例如我想新建一个变量vhdpath_new,只要在变量名称前加"$":$vhdpath_new,这样,我们的新的变量就能够使用了。变量,顾名思义,它的"量"是可以变化的,可是如何才能让它发生改变呢?方法很多,例如:从主机获取(键盘输入等)、脚本内部运算等等。如何又从键盘输入内容呢?我们可以试用read-host这个命令,比如在PS中$vhdpath_new=read-host("请输入硬盘路径,包含硬盘文件名及格式"),回车后根据提示输入:D\Hyper-v\Virtual Hard Disk\disk1.vhdx,然后再在PS中输入$vhdpath_new来回显变量的值,这个时候我们可以看见$vhdpath_new的值已经发生了变化。这里有点需要注意的是:通过read-host从键盘输入的内容,不管是纯数字还是非纯数字,一般情况下输入的内容默认类型是String字符型的(在运算时需要注意,当时我和九叔就在操作内存的时候找了好久的原因,总是报内存溢出,最后还是通过gettype().name发现read-host的的默认类型是String的)。

于是乎,我们的脚本可以进化成如下状态了:

输入部分:

$vhdpath_new= read-host("请输入模板路径【包括文件名和后缀】")
$NewVMGeneration= read-host("请输入新建虚拟机的版本号")
$NewVMMemoryStartupBytes= read-host("请输入启动内存")
$name= read-host("请输入虚拟机名称")
$NewVMSwitchName= read-host("请输入虚拟机需要连接网络的名称")
$NewVMvCPU= read-host("请输入虚拟机的虚拟CPU数量")


创建部分:

New-VM -VHDPath $vhdpath_new -Generation $NewVMGeneration -MemoryStartupBytes $NewVMMemoryStartupBytes  -Name $name -SwitchName $NewVMSwitchName
Set-VMProcessor -VMName $name -Count $NewVMvCPU


     到这个地方,差不多就完成了基本的核心部分,下个篇章我们一起来探讨一下如何批量创建VM以及实现的思路与方法!

第一次写博客,有不足的地方希望大家帮忙多多指点,感谢九叔以及群里的朋友无私奉献的帮助!希望大家有空的时候可以多多交流~