前幾天看了Vagrant的介紹,今天正好有空,打算安裝下試試。由於自己用的是Windows的開發環境,所以就在window下試著搭建了下。遇到一些問題,記錄下。
關於Vagrant,及為什麼用Vagrant。大家可以去看這篇文章《為什麼要使用Vagrant》,個人感覺說的比較詳細。
接下來,說下我的整個安裝過程。
Vagrant 除了virtualbox,還支持HyperV、VMWare等虛擬軟件。virtualbox與vagrant是最常用的搭配,也是文檔最多的,所以我也選了這對組合。
box 的鏡像除了使用下載好的本地文件還可以使用在線的box鏡像,添加鏡像時,還是會下載。
2.1 安裝virtualbox和vagrant
同其他windows軟件一樣,“下一步”即可。
2.2 應用
1、給vagrant 添加鏡像。
D:\vagrant\>vagrant box add base CentOS-6.6-x86_64.box
說明:
vagrant box
vagrant命令base
添加box的名稱centos-6.6-x86_64.box-
本地box的文件名vagrant box list
查看添加的box鏡像列表。也可以添加在線box,和添加本地box一樣。通過命令vagrant box add Ubuntu/trusty64
。ubuntu/trusty64為在線鏡像名稱。
在線鏡像地址 vagrantCloud。(國內的網絡訪問可能不太通,建議下載後添加 )
這是我使用centos的鏡像 centos-6.6-x86_64.box
鏈接: http://pan.baidu.com/s/1i5si9yl 密碼: 7ug7
2、初始化虛擬機。
D:\\vagrant\\>mkdir worker # 創建工作環境
D:\\vagrant\\>cd worker
D:\\vagarnt\\worker\\>vagrant init [boxname] # 當添加的box的別名不為 base 時,此處需要添加 boxname
3、啟動虛擬機
D:\\vagrant\\worker\\>vagrant up
看到如下信息,說明虛擬機啟動成功:
D:\vagrant\worker>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'base'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: worker_default_1448939529781_46842
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
default: Adapter 2: hostonly
==> default: Forwarding ports...
default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
default: SSH address: 127.0.0.1:2222
default: SSH username: vagrant
default: SSH auth method: private key
default: Warning: Connection timeout. Retrying...
default: Warning: Connection timeout. Retrying...
default: Warning: Remote connection disconnect. Retrying...
default:
default: Vagrant insecure key detected. Vagrant will automatically replace
default: this with a newly generated keypair for better security.
default:
default: Inserting generated public key within guest...
default: Removing insecure key from the guest if it's present...
default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
default: The guest additions on this VM do not match the installed version of
default: VirtualBox! In most cases this is fine, but in rare cases it can
default: prevent things such as shared folders from working properly. If you see
default: shared folder errors, please make sure the guest additions within the
default: virtual machine match the version of VirtualBox you have installed on
default: your host and reload your VM.
default:
default: Guest Additions Version: 4.3.28
default: VirtualBox Version: 5.0
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
default: /vagrant => D:/vagrant/worker
注意:
此處會有個錯誤,卡在此處:
Bringing machine 'default' up with 'hyperv' provider...
==> default: Verifying Hyper-V is enabled...
經查找,網上許多網友說是vagrant的啟動虛擬機時,使用了windows 系統自帶的 hyperv 虛擬機導致。但他們的問題大部分是發生在windows 8上,而我的系統為window7 。
最後,看到有網友說需要配置虛擬機 virtualbox 的環境變量(將virtualbox的安裝目錄添加到環境變量path中),試了下果然解決我的問題。
20151217更新:
網絡的配置,網絡的配置在worker文件夾下的Vagrantfile 文件中。vagrant創建的虛擬機有3中配置網絡模式:
較為常用是端口映射,就是將虛擬機中的端口映射到宿主機對應的端口直接使用 ,在Vagrantfile中配置:
config.vm.network “forwarded_port”, guest: 80, host: 8080
將配置直接去掉注釋“#”即可。guest: 80 表示虛擬機中的80端口, host: 8080 表示映射到宿主機的8080端口。
如果需要自己自由的訪問虛擬機,但是別人不需要訪問虛擬機,可以使用private_network,並為虛擬機設置IP ,在Vagrantfile中配置:
config.vm.network “private_network”, ip: “192.168.56.2”
192.168.56.2 表示虛擬機的IP,多台虛擬機的話需要互相訪問的話,設置在相同網段即可。該ip默認幫到eth1上。
如果需要將虛擬機作為當前局域網中的一台計算機,由局域網進行DHCP,那麼在Vagrantfile中配置:
config.vm.network :public_network
此時虛擬機就如同宿主機一樣鏈接到網絡中,享有和宿主機一樣的網絡權限。此時,若ip為自由分配,可使用127.0.0.1地址,
端口使用啟動時在命令窗口提示的端口,登陸機器查看分配的ip,即可使用分配的ip登陸。若ip為固定的,可在配置中寫好。如下:
config.vm.network :"public_network",ip: "192.168.56.2"
#還可設置網橋,以無線為例 -- 此配置需驗證,一般只需配置最簡即可。
config.vm.network "public_network", :bridge => 'en1: Wi-Fi (AirPort)'
4、鏈接使用
由於windows不支持 ssh 命令,所以我們需要使用其他的ssh的客戶端來鏈接。就拿我使用的xshell來做說。
在cmd窗口中錄入:vagrant ssh
。會看到你的主機��址、端口、以及key的存放位置。
D:\vagrant\worker>vagrant ssh
`ssh` executable not found in any directories in the %PATH% variable. Is an
SSH client installed? Try installing Cygwin, MinGW or Git, all of which
contain an SSH client. Or use your favorite SSH client with the following
authentication information shown below:
Host: 127.0.0.1
Port: 2222
Username: vagrant
Private key: D:/vagrant/worker/.vagrant/machines/default/virtualbox/private_key
在xshell中添加ssh的key。可以參考 這裡。
由於我們的key已經生成,所以我們只需導入即可。
工具–>用戶秘鑰管理–>導入,即可。
創建好回話後,在點擊登錄的時候選擇 public key ,會看到我們導入的 private_key。
此處密碼不用填寫,直接點擊登錄即可進入系統命令行了。
到這裡,便和操作普通的linux的系統一樣了。
若想使用root用戶登錄,見下文 3.3 節。
5、打包分發
當你配置好開發環境後,退出並關閉虛擬機。在終端裡對開發環境進行打包:
vagrant package
打包完成後會在當前目錄生成一個 package.box 的文件,將這個文件傳給其他用戶,其他用戶只要添加這個 box
並用其初始化自己的開發目錄就能得到一個一模一樣的開發環境了。
虛擬機關機:D:\\vagrant\\worker\\>vagrant halt
虛擬機掛起:D:\\vagrant\\worker\\>vagrant suspend
虛擬機恢復:D:\\vagrant\\worker\\>vagrant resume
刪除虛擬機:D:\\vagrant\\worker\\>vagrant destory
查看虛擬機運行狀態: D:\\vagrant\\worker\\>vagrant status
重啟虛擬機: D:\\vagrant\\worker\\>vagrant reload
Vagrant和VirtualBox安裝完成後,默認存放虛擬機鏡像文件的位置在系統盤。這對於大多數系統盤容量有限的人來說,
很快就會收到“磁盤容量不足”的告警。通過必要的設置將鏡像數據移出系統盤。
3.2.1 更改VirtualBox的鏡像文件存放位置
具體步驟如下:
1、打開VirtualBox,從菜單項選擇 全局設置 (快捷鍵是 Ctrl-G )
2、選擇 常規 裡的 默認虛擬電腦位置(M)
3、設置為非系統盤的位置。
4、將原位置中的虛擬機鏡像移動到新的位置。
如果在設置前已經安裝了虛擬機,那麼在Windows 資源管理器中,選擇對應目錄中的 Vbox 文件,即可將新目錄中的虛擬機鏡像添加到VirtualBox中。
3.2.2 更改Vagrant的鏡像存儲位置
Vagrant對於虛擬機的管理分成兩個部分:Box和Machine。Box是指初始的未部署的虛擬機鏡像文件。這個文件相當於是虛擬機的一個模板,
可以進行無限制次數的復制。Machine,是指處於可運行狀態下的虛擬機。當在Vagrant中添加box是,默認Vagrant會將這些虛擬機模板鏡像文件存
放在c:\User\.Vagrant.d裡。
因此,當使用Vagrant管理的虛擬機模板鏡像較多時,這個目錄也是比較大的。可以轉移到其他磁盤分區上。方法是:
1、將 c:\User\.vagrant.d 目錄移動到新的位置
2、設置 VAGRANT_HOME 環境變量指向新的位置即可。
在linux系統下沒有root權限是很不舒服的,所以查了下root用戶登錄的配置,在vagrantfile 中增加配置:
config.ssh.username = 'root'
config.ssh.password = 'vagrant'
config.ssh.insert_key = 'true'
啟動後看到日志 :
D:\vagrant\worker>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
default: Adapter 2: hostonly
==> default: Forwarding ports...
default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
default: SSH address: 127.0.0.1:2222
default: SSH username: root
default: SSH auth method: password
default: Warning: Connection timeout. Retrying...
default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
default: The guest additions on this VM do not match the installed version of
default: VirtualBox! In most cases this is fine, but in rare cases it can
default: prevent things such as shared folders from working properly. If you see
default: shared folder errors, please make sure the guest additions within the
default: virtual machine match the version of VirtualBox you have installed on
default: your host and reload your VM.
default:
default: Guest Additions Version: 4.3.28
default: VirtualBox Version: 5.0
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
default: /vagrant => D:/vagrant/dev
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: flag to force provisioning. Provisioners marked to run always will still run.
1、先使用 box 初始化: vagrant init
2、修改配置文件如下:
# -*- mode: ruby -*-
# vi: set ft=ruby :
# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
config.vm.provision "shell", inline: "echo Hello"
config.vm.define "master" do |saltmaster|
saltmaster.vm.box = "base"
saltmaster.vm.host_name = 'saltmaster.local'
saltmaster.vm.network "private_network", ip: "192.168.33.13"
saltmaster.ssh.username = 'root'
saltmaster.ssh.password = 'vagrant'
saltmaster.ssh.insert_key = 'true'
end
config.vm.define "minion" do |saltminion|
saltminion.vm.box = "base"
saltminion.vm.host_name = 'saltminion.local'
saltminion.vm.network "private_network", ip: "192.168.33.14"
saltminion.ssh.username = 'root'
saltminion.ssh.password = 'vagrant'
saltminion.ssh.insert_key = 'true'
end
end
3、正常啟動即可 : vagrant up
4、登錄
使用 vagrant ssh + 名稱 登錄
pylixm@pylixm-pc /d/vagrant/dev331314 $ vagrant ssh master
[email protected]'s password:
Welcome to your Vagrant-built virtual machine.
[root@saltmaster ~]#
使用 ip 直接登錄
直接添加是不行的,這裡提供了一中變向的方式:先將virtualbox 的虛機轉成 box 鏡像 ,再將鏡像添加到 vagrant 管理;
詳細 –> 這裡
1、打包已有虛機(虛機必須用virtualbox打開過,為了讓virtualbox可以找到該虛機)
vagrant package --base mybox --output /path/to/mybox.box
2、添加 box 鏡像
vagrant box add mybox /path/to/mybox.box
如何使用vagrant在虛擬機安裝Hadoop集群 http://www.linuxidc.com/Linux/2013-04/82750.htm
Vagrant 中高效的 Puppet 模塊管理 http://www.linuxidc.com/Linux/2014-05/101873.htm
利用Vagrant搭建多平台環境 http://www.linuxidc.com/Linux/2015-09/123518.htm
使用 Vagrant 和 Fabric 用於集成測試 http://www.linuxidc.com/Linux/2014-07/104113.htm
使用 Vagrant 搭建開發環境 http://www.linuxidc.com/Linux/2014-07/104116.htm
Windows 下配置 Vagrant 環境 http://www.linuxidc.com/Linux/2014-07/104115.htm
使用 Vagrant 搭建開發環境 http://www.linuxidc.com/Linux/2014-07/104116.htm
通過 Vagrant 搭建虛擬機環境 http://www.linuxidc.com/Linux/2015-08/121985.htm
使用Vagrant和Virtualbox創建虛擬機 http://www.linuxidc.com/Linux/2016-08/134435.htm
Ubuntu下使用Vagrant搭建虛擬開發環境 http://www.linuxidc.com/Linux/2016-12/138113.htm