1胳施、定義vm的configure配置節(jié)點(diǎn)(一個(gè)節(jié)點(diǎn)就是一個(gè)虛擬機(jī))
config.vm.define :mysql do |mysql_config|
# ...
end
表示在config配置中,定義一個(gè)名為mysql的vm配置,該節(jié)點(diǎn)下的配置信息命名為mysql_config列吼; 如果該Vagrantfile配置文件只定義了一個(gè)vm岭洲,這個(gè)配置節(jié)點(diǎn)層次可忽略。
還可以在一個(gè)Vagrantfile文件里建立多個(gè)虛擬機(jī)呼盆,一般情況下年扩,你可以用多主機(jī)功能完成以下任務(wù):
▲ 分布式的服務(wù),例如網(wǎng)站服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器
▲ 分發(fā)系統(tǒng)
▲ 測(cè)試接口
▲ 災(zāi)難測(cè)試?
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)定義了多主機(jī)之后访圃,在使用vagrant命令的時(shí)候厨幻,就需要加上主機(jī)名,例如vagrant ssh web;也有一些命令况脆,如果你不指定特定的主機(jī)饭宾,那么將會(huì)對(duì)所有的主機(jī)起作用,比如vagrant up漠另;你也可以使用表達(dá)式指定特定的主機(jī)名捏雌,例如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'
}
這里是定義一個(gè)hashmap满败,以key-value方式來(lái)存儲(chǔ)vm主機(jī)名和ip地址肤频。
3、配置信息
ENV["LC_ALL"] = "en_US.UTF-8"
#指定vm的語(yǔ)言環(huán)境算墨,缺省地宵荒,會(huì)繼承host的locale配置
Vagrant.configure("2") do |config|
? ? # ...
end
參數(shù)2,表示的是當(dāng)前配置文件使用的vagrant configure版本號(hào)為Vagrant 1.1+,如果取值為1净嘀,表示為Vagrant 1.0.x Vagrantfiles报咳,舊版本暫不考慮,記住就寫(xiě)2即可挖藏。
do … end 為配置的開(kāi)始結(jié)束符暑刃,所有配置信息都寫(xiě)在這兩段代碼之間。 config是為當(dāng)前配置命名膜眠,你可以指定任意名稱(chēng)岩臣,如myvmconfig,在后面引用的時(shí)候宵膨,改為自己的名字即可架谎。
4、vm提供者配置
config.vm.provider :virtualbox do |vb|
? ? # ...
end
▲vm provider通用配置
虛機(jī)容器提供者配置辟躏,對(duì)于不同的provider谷扣,特有的一些配置,此處配置信息是針對(duì)virtualbox定義一個(gè)提供者鸿脓,命名為vb抑钟,跟前面一樣,這個(gè)名字隨意取野哭,只要節(jié)點(diǎn)內(nèi)部調(diào)用一致即可在塔。
配置信息又分為通用配置和個(gè)性化配置,通用配置對(duì)于不同provider是通用的拨黔,常用的通用配置如下:
#指定vm-name蛔溃,也就是virtualbox管理控制臺(tái)中的虛機(jī)名稱(chēng)。如果不指定該選項(xiàng)會(huì)生成一個(gè)隨機(jī)的名字,不容易區(qū)分贺待。
vb.name = "centos7"
# vagrant up啟動(dòng)時(shí)徽曲,是否自動(dòng)打開(kāi)virtual box的窗口,缺省為false
vb.gui = true
#指定vm內(nèi)存麸塞,單位為MB
vb.memory = "1024"
#設(shè)置CPU個(gè)數(shù)
vb.cpus = 2
▲vm provider個(gè)性化配置(virtualbox)
上面的provider配置是通用的配置秃臣,針對(duì)不同的虛擬機(jī),還有一些的個(gè)性的配置哪工,通過(guò)vb.customize配置來(lái)定制奥此。
對(duì)virtual box的個(gè)性化配置,可以參考:VBoxManage modifyvm 命令的使用方法雁比。詳細(xì)的功能接口和使用說(shuō)明稚虎,可以參考virtualbox官方文檔。
#修改vb.name的值
v.customize ["modifyvm", :id, "--name", "mfsmaster2"]
#如修改顯存偎捎,缺省為8M蠢终,如果啟動(dòng)桌面,至少需要10M茴她,如下修改為16M:
vb.customize ["modifyvm", :id, "--vram", "16"]
#調(diào)整虛擬機(jī)的內(nèi)存
vb.customize ["modifyvm", :id, "--memory", "1024"]
#指定虛擬CPU個(gè)數(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ū)動(dòng)器不掛在iso,指定為“emptydrive”丈牢。如果要卸載光驅(qū)兜喻,medium傳入none即可。
#從這個(gè)指令可以看出赡麦,customize方法傳入一個(gè)json數(shù)組,按照順序傳入?yún)?shù)即可帕识。
#json數(shù)組傳入多個(gè)參數(shù)
v.customize ["modifyvm", :id, "--name", “mfsserver3", "--memory", “2048"]
5泛粹、一組相同配置的vm
前面配置了一組vm的hash map,定義一組vm時(shí)肮疗,使用如下節(jié)點(diǎn)遍歷晶姊。
#遍歷app_servers map,將key和value分別賦值給app_server_name和app_server_ip
app_servers.each do |app_server_name, app_server_ip|
? ? #針對(duì)每一個(gè)app_server_name伪货,來(lái)配置config.vm.define配置節(jié)點(diǎn)们衙,命名為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ù)
你可以編寫(xiě)一些命令,讓vagrant在啟動(dòng)虛擬機(jī)的時(shí)候自動(dòng)執(zhí)行愚臀,這樣你就可以省去手動(dòng)配置環(huán)境的時(shí)間了忆蚀。
▲ 腳本何時(shí)會(huì)被執(zhí)行
●?第一次執(zhí)行vagrant up命令
●?執(zhí)行vagrant provision命令
●?執(zhí)行vagrant reload --provision或者vagrant up --provision命令
●?你也可以在啟動(dòng)虛擬機(jī)的時(shí)候添加--no-provision參數(shù)以阻止腳本被執(zhí)行
▲?provision任務(wù)是什么?
provision任務(wù)是預(yù)先設(shè)置的一些操作指令,格式:
config.vm.provision 命令字 json格式參數(shù)
config.vm.provion 命令字 do |s|
? ? s.參數(shù)名 = 參數(shù)值
end
每一個(gè) config.vm.provision 命令字 代碼段馋袜,我們稱(chēng)之為一個(gè)provisioner男旗。
根據(jù)任務(wù)操作的對(duì)象,provisioner可以分為:
● Shell
●?File
●?Ansible
●?CFEngine
●?Chef
●?Docker
●?Puppet
●?Salt
根據(jù)vagrantfile的層次欣鳖,分為:
configure級(jí):它定義在 Vagrant.configure("2") 的下一層次察皇,形如: config.vm.provision ...
vm級(jí):它定義在 config.vm.define "web" do |web| 的下一層次,web.vm.provision ...
執(zhí)行的順序是先執(zhí)行configure級(jí)任務(wù)泽台,再執(zhí)行vm級(jí)任務(wù)什荣,即便configure級(jí)任務(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只是一個(gè)開(kāi)始师痕,對(duì)于inline模式溃睹,命令只能在寫(xiě)在一行中。
單行腳本使用的基本格式:
config.vm.provision "shell", inline: "echo fendo"
shell命令的參數(shù)還可以寫(xiě)入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é)點(diǎn)外面笔横,寫(xiě)入命名內(nèi)聯(lián)腳本:
$script = <<SCRIPT
echo I am provisioning...
echo hello provision.
SCRIPT
然后竞滓,inline調(diào)用如下:
config.vm.provision "shell", inline: $script
● 外部腳本
也可以把代碼寫(xiě)入代碼文件,并保存在一個(gè)shell里吹缔,進(jìn)行調(diào)用:
config.vm.provision "shell", path: "script.sh"
script.sh的內(nèi)容:
echo hello provision.
修改完Vagrantfile的配置后商佑,記得要重啟虛擬機(jī),才能使用虛擬機(jī)更新后的配置厢塘。
vagrant reload
Vagrant的配置文件Vagrantfile詳解-1 點(diǎn)擊查看
參考文章:https://blog.csdn.net/u011781521/article/details/80291765