1、定義vm的configure配置節(jié)點(一個節(jié)點就是一個虛擬機)
config.vm.define :mysql do |mysql_config|
# ...
end
表示在config配置中,定義一個名為mysql的vm配置,該節(jié)點下的配置信息命名為mysql_config; 如果該Vagrantfile配置文件只定義了一個vm,這個配置節(jié)點層次可忽略。
還可以在一個Vagrantfile文件里建立多個虛擬機,一般情況下,你可以用多主機功能完成以下任務(wù):
▲ 分布式的服務(wù),例如網(wǎng)站服務(wù)器和數(shù)據(jù)庫服務(wù)器
▲ 分發(fā)系統(tǒng)
▲ 測試接口
▲ 災(zāi)難測試?
Vagrant.configure("2") do |config|
? config.vm.define "web" do |web|
? ? web.vm.box = "apache"
? end
? config.vm.define "db" do |db|
? ? db.vm.box = "mysql"
? end
end
當(dāng)定義了多主機之后,在使用vagrant命令的時候,就需要加上主機名,例如vagrant ssh web;也有一些命令,如果你不指定特定的主機,那么將會對所有的主機起作用,比如vagrant up;你也可以使用表達式指定特定的主機名,例如vagrant up /follower[0-9]/。
2、通用數(shù)據(jù) 設(shè)置一些基礎(chǔ)數(shù)據(jù),供配置信息中調(diào)用。
app_servers = {
? ? :service1 => '192.168.10.10',
? ? :service2 => '192.168.10.11'
}
這里是定義一個hashmap,以key-value方式來存儲vm主機名和ip地址。
3、配置信息
ENV["LC_ALL"] = "en_US.UTF-8"
#指定vm的語言環(huán)境,缺省地,會繼承host的locale配置
Vagrant.configure("2") do |config|
? ? # ...
end
參數(shù)2,表示的是當(dāng)前配置文件使用的vagrant configure版本號為Vagrant 1.1+,如果取值為1,表示為Vagrant 1.0.x Vagrantfiles,舊版本暫不考慮,記住就寫2即可。
do … end 為配置的開始結(jié)束符,所有配置信息都寫在這兩段代碼之間。 config是為當(dāng)前配置命名,你可以指定任意名稱,如myvmconfig,在后面引用的時候,改為自己的名字即可。
4、vm提供者配置
config.vm.provider :virtualbox do |vb|
? ? # ...
end
▲vm provider通用配置
虛機容器提供者配置,對于不同的provider,特有的一些配置,此處配置信息是針對virtualbox定義一個提供者,命名為vb,跟前面一樣,這個名字隨意取,只要節(jié)點內(nèi)部調(diào)用一致即可。
配置信息又分為通用配置和個性化配置,通用配置對于不同provider是通用的,常用的通用配置如下:
#指定vm-name,也就是virtualbox管理控制臺中的虛機名稱。如果不指定該選項會生成一個隨機的名字,不容易區(qū)分。
vb.name = "centos7"
# vagrant up啟動時,是否自動打開virtual box的窗口,缺省為false
vb.gui = true
#指定vm內(nèi)存,單位為MB
vb.memory = "1024"
#設(shè)置CPU個數(shù)
vb.cpus = 2
▲vm provider個性化配置(virtualbox)
上面的provider配置是通用的配置,針對不同的虛擬機,還有一些的個性的配置,通過vb.customize配置來定制。
對virtual box的個性化配置,可以參考:VBoxManage modifyvm 命令的使用方法。詳細的功能接口和使用說明,可以參考virtualbox官方文檔。
#修改vb.name的值
v.customize ["modifyvm", :id, "--name", "mfsmaster2"]
#如修改顯存,缺省為8M,如果啟動桌面,至少需要10M,如下修改為16M:
vb.customize ["modifyvm", :id, "--vram", "16"]
#調(diào)整虛擬機的內(nèi)存
vb.customize ["modifyvm", :id, "--memory", "1024"]
#指定虛擬CPU個數(shù)
vb.customize ["modifyvm", :id, "--cpus", "2"]
#增加光驅(qū):
vb.customize ["storageattach",:id,"--storagectl", "IDE Controller","--port","0","--device","0","--type","dvddrive","--medium","/Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso"]
#注:meduim參數(shù)不可以為空,如果只掛載驅(qū)動器不掛在iso,指定為“emptydrive”。如果要卸載光驅(qū),medium傳入none即可。
#從這個指令可以看出,customize方法傳入一個json數(shù)組,按照順序傳入?yún)?shù)即可。
#json數(shù)組傳入多個參數(shù)
v.customize ["modifyvm", :id, "--name", “mfsserver3", "--memory", “2048"]
5、一組相同配置的vm
前面配置了一組vm的hash map,定義一組vm時,使用如下節(jié)點遍歷。
#遍歷app_servers map,將key和value分別賦值給app_server_name和app_server_ip
app_servers.each do |app_server_name, app_server_ip|
? ? #針對每一個app_server_name,來配置config.vm.define配置節(jié)點,命名為app_config
? ? config.vm.define app_server_name do |app_config|
? ? ? ? ? # 此處配置,參考config.vm.define
? ? end
end
如果不想定義app_servers,下面也是一種方案:
(1..3).each do |i|
? ? ? ? config.vm.define "app-#{i}" do |node|
? ? ? ? app_config.vm.hostname = "app-#{i}.vagrant.internal"
? ? ? ? app_config.vm.provider "virtualbox" do |vb|
? ? ? ? ? ? vb.name = app-#{i}
? ? ? ? end
? end
end
6、provision任務(wù)
你可以編寫一些命令,讓vagrant在啟動虛擬機的時候自動執(zhí)行,這樣你就可以省去手動配置環(huán)境的時間了。
▲ 腳本何時會被執(zhí)行
●?第一次執(zhí)行vagrant up命令
●?執(zhí)行vagrant provision命令
●?執(zhí)行vagrant reload --provision或者vagrant up --provision命令
●?你也可以在啟動虛擬機的時候添加--no-provision參數(shù)以阻止腳本被執(zhí)行
▲?provision任務(wù)是什么?
provision任務(wù)是預(yù)先設(shè)置的一些操作指令,格式:
config.vm.provision 命令字 json格式參數(shù)
config.vm.provion 命令字 do |s|
? ? s.參數(shù)名 = 參數(shù)值
end
每一個 config.vm.provision 命令字 代碼段,我們稱之為一個provisioner。
根據(jù)任務(wù)操作的對象,provisioner可以分為:
● Shell
●?File
●?Ansible
●?CFEngine
●?Chef
●?Docker
●?Puppet
●?Salt
根據(jù)vagrantfile的層次,分為:
configure級:它定義在 Vagrant.configure("2") 的下一層次,形如: config.vm.provision ...
vm級:它定義在 config.vm.define "web" do |web| 的下一層次,web.vm.provision ...
執(zhí)行的順序是先執(zhí)行configure級任務(wù),再執(zhí)行vm級任務(wù),即便configure級任務(wù)在vm定義的下面才定義。例如:
Vagrant.configure("2") do |config|
? config.vm.provision "shell", inline: "echo 1"
? config.vm.define "web" do |web|
? ? web.vm.provision "shell", inline: "echo 2"
? end
? config.vm.provision "shell", inline: "echo 3"
end
輸出結(jié)果:
==> default: "1"
==> default: "2"
==> default: "3"
▲?如何使用
● 單行腳本
helloword只是一個開始,對于inline模式,命令只能在寫在一行中。
單行腳本使用的基本格式:
config.vm.provision "shell", inline: "echo fendo"
shell命令的參數(shù)還可以寫入do ... end代碼塊中,如下:
config.vm.provision "shell" do |s|
? s.inline = "echo hello provision."
end
●?內(nèi)聯(lián)腳本
如果要執(zhí)行腳本較多,可以在Vagrantfile中指定內(nèi)聯(lián)腳本,在Vagrant.configure節(jié)點外面,寫入命名內(nèi)聯(lián)腳本:
$script = <<SCRIPT
echo I am provisioning...
echo hello provision.
SCRIPT
然后,inline調(diào)用如下:
config.vm.provision "shell", inline: $script
● 外部腳本
也可以把代碼寫入代碼文件,并保存在一個shell里,進行調(diào)用:
config.vm.provision "shell", path: "script.sh"
script.sh的內(nèi)容:
echo hello provision.
修改完Vagrantfile的配置后,記得要重啟虛擬機,才能使用虛擬機更新后的配置。
vagrant reload
Vagrant的配置文件Vagrantfile詳解-1 點擊查看
參考文章:https://blog.csdn.net/u011781521/article/details/80291765