首先說說vagrant與docker的區別
vagrant是用來管虛擬機的,而docker是管容器的(如不準確,還望指正)
docker的啓動速度當然是無可比擬的,而vagrant當然不是要很docker比啓動速度的,vagrant就是管虛擬機的,虛擬機與容器的區別,大家見仁見智。
再來介紹一下vagrant:
Vagrant是一個基於Ruby的工具,用於創建和部署虛擬化開發環境。它 使用Oracle的開源VirtualBox虛擬化系統,使用 Chef創建自動化虛擬環境---百度百科
首先提一個需求,我想批量的創建一批虛擬機,基於不同的鏡像,基於不同的系統(這裏主要是Linux系統),每個主機擁有若干網卡並分配指定網段及IP。
如果是vmware,我想大多數人想的是不停的點擊不同的按鈕已完成上面的需求,當然了,如果用pyVmomi也許並不需要太多的人工點擊(筆者覺得一步一步的重複點擊是很反人類的~)
如果是其他雲平臺,當然是藉助API了,不過我想創建的這一批主機是能像docker一樣分發的,比如讓每個人在主機的電腦上就能簡單的創建所需環境,而在私有云上,每人一套可能就太浪費資源了,每個人公用,又顯得不是那麼幹淨。
如果不是以主機爲單位,基於docker,將服務應用打散,放置於各個容器,並用docker編排工具如kubernetes,compose什麼的來創建也是不錯的,不過這裏爲了突出一下vagrant的便捷就以主機爲單位了。
需求繼續具體如下,2個app server,2個db server,1個負載均衡lb server
再次之前,簡單的vagrant入門一下
vagrant安裝
一:安裝virtualbox
下載對應的安裝包
https://www.virtualbox.org/wiki/Downloads
二:安裝vagrant
下載對應的安裝包
https://www.vagrantup.com/downloads.html
因爲個平臺都有對應的安裝包,所以安裝過程就不做過多介紹
本文主要在window上操作
virtualbox 4.2.36
vagrant 1.8.1
Linux平臺如centos參考 http://blog.csdn.net/haibinzhang/article/details/9234753
安裝完成後應該是這樣的
然後之主要用的幾個命令,詳細說明參考,官方文檔:https://www.vagrantup.com/docs/
本文主要說明以下幾個選項
box,destroy,global-status,halt,init,package,resume,ssh,status,suspend,up
上面命令總結起來主要分爲五個部分
一:按照一定格式打包的vagrant環境文件,類似鏡像文件
box
二:虛擬機操作(destroy,halt,init,suspend,up)
銷燬,關機,初始化,恢復,掛起,開機
三:打包
package
四:連接
ssh
五:虛擬機狀態
status,global-status
在建立一個虛擬機之前,當然需要一個鏡像,這裏就是以.box爲後綴名的box文件,這裏可以本地添加或者在線添加
box下載地址:http://www.vagrantbox.es/
vagrant box list 查看當前box列表
本地添加box,如下
vagrant box add centos6 E:\vagrant\box\centos65.box
centos6是我們爲自定義的box名字,後面會用到,最後接的是box文件路徑
注:建議本地添加時候工作目錄與box文件在同一磁盤下,比如C盤,D盤
在線添加box,在線添加的box名稱格式爲 用戶/box名,參考https://atlas.hashicorp.com/boxes/search,如下
vagrant box add hashicorp/precise64 或者 vagrant box add https://github.com/2creatives/vagrant-centos/releases/download/v6.4.2/centos64-x86_64-20140116.box
查看box列表
現在我們可以初始化一個我們需要的虛擬機了
創建一個工作目錄,用於存儲相關文件
vagrant init
會在當前目錄創建一個Vagrantfile文件,這個文件告訴vagrant我們要創建一個怎麼的虛擬機
這裏我們執行
vagrant init centos6
將所有註釋去除後,主要內容如下
Vagrant.configure(2) do |config| config.vm.box = "centos6" end
上面的 config.vm.box = "centos6",主要是說明基於哪個box文件。
然後啓動
vagrant up
啓動過程如上。
啓動之後我們可以直接ssh進去
vagrant ssh
關機則是
vagrant halt
掛起
vagrant suspend
從掛起狀態恢復
vagrant resume
整機虛擬機銷燬,有點從磁盤上移除的意思
vagrant destroy
注:上面的命令都得在vagrantfile文件所在目錄
然後是查看虛擬機狀態
vagrant status
查看當前目錄下vagrantfile文件對應的虛擬機狀態
vagrant global-status
查看全局虛擬機狀態
注:既然虛擬機,當然能執行快照什麼的,請自行探索
入門結束。。。
進入正題
批量創建2個app server,2個db server,1個負載均衡lb server
想必也能看出來,比較照重要的是vagrantfile文件,這個文件告訴vagrant需要執行什麼,創建什麼。
首先定義每個虛擬機對應的ip及主機名,如下
app_servers = { :app1 => ['192.168.13.2','192.168.15.3'], :app2 => ['192.168.13.3','192.168.15.4'] } db_servers = { :db1 => ['192.168.14.2','192.168.15.5'], :db2 => ['192.168.14.3','192.168.15.6'] } lb_servers = { :lb1 => '192.168.15.2' }
因爲是基於ruby的,所以類似python中的列表,字典的寫法什麼的稍稍不同,不過也不難看懂,以答案推答案嘛
app-server定義了兩個主機app1,app2,並綁定兩塊網卡的ip地址
db-server如上
lb-server就一個
然後當然是循環了,如果一條一條的說明,也就沒必要聲明app-servers之類的
app_servers.each do |app_server_name,app_server_ip| config.vm.define app_server_name do |app_config| app_config.vm.host_name = app_server_name.to_s app_config.vm.network :private_network,ip: app_server_ip[0] app_config.vm.network :private_network,ip: app_server_ip[1],virtualbox_inet:true end end
主要有兩點說明
一:有幾個do,就有幾個end
二:遍歷app-server,用app_servers.each do |app_server_name,app_server_ip|,而其中app_server_name,app_server_ip當然是遍歷時候的變量了,對應app-server裏面的app1,['192.168.13.2','192.168.15.3']
config.vm.define 定義創建的主機名
app_config.vm.host_name 定義hostname
app_config.vm.network :private_network,ip 定義網卡綁定ip
完整如下
Vagrant.configure(2) do |config| config.vm.box = "centos6" end app_servers = { :app1 => ['192.168.13.2','192.168.15.3'], :app2 => ['192.168.13.3','192.168.15.4'] } db_servers = { :db1 => ['192.168.14.2','192.168.15.5'], :db2 => ['192.168.14.3','192.168.15.6'] } lb_servers = { :lb1 => '192.168.15.2' } app_servers.each do |app_server_name,app_server_ip| config.vm.define app_server_name do |app_config| app_config.vm.host_name = app_server_name.to_s app_config.vm.network :private_network,ip: app_server_ip[0] app_config.vm.network :private_network,ip: app_server_ip[1],virtualbox_inet: true end end db_servers.each do |db_server_name,db_server_ip| config.vm.define db_server_name do |app_config| app_config.vm.host_name = db_server_name.to_s app_config.vm.network :private_network,ip: db_server_ip[0] app_config.vm.network :private_network,ip: db_server_ip[1],virtualbox_inet: true end end lb_servers.each do |lb_server_name,lb_server_ip| config.vm.define lb_server_name do |app_config| app_config.vm.host_name = lb_server_name.to_s app_config.vm.network :private_network,ip: lb_server_ip end end end
啓動大概如下
其實一次性啓五個,一般的電腦(指4GB)是稍顯吃力的,所以要麼在自己機房的服務器上玩,要麼在稍微好點的主機上玩吧~~~
後記:個人覺得vagrant對於運維還是很友好的,基於命令行的工具才足夠酷(個人感覺)~而且一些情況下,我們需要頻繁的創建虛擬機去測試,搭建一些服務集羣的時候,需要一個輕量,簡易,可重複,具有可靠性的環境,而這些,vagrant是能夠提供的,比起在vmware或者私有云上創建虛擬機還是更加簡單並好用的,