PowerShell創建虛擬機 (一、基本思路與實現代碼)

      首先來說明一下爲什麼要寫這個腳本,記得當初剛開始做私有云實驗的時候,對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以及實現的思路與方法!

第一次寫博客,有不足的地方希望大家幫忙多多指點,感謝九叔以及羣裏的朋友無私奉獻的幫助!希望大家有空的時候可以多多交流~





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章