Vagrant系列(二)----Vagrant的配置文件Vagrantfile詳解
一、簡(jiǎn)介
在我們的工作目錄下有一個(gè)vagrantfile文件,里面包含有大量的配置信息,通過(guò)它可以定義虛擬機(jī)的各種配置,如網(wǎng)絡(luò)、內(nèi)存、主機(jī)名等,主要包括三個(gè)方面的配置,虛擬機(jī)的配置、SSH配置、vagrant的一些基礎(chǔ)配置。Vagrant是使用Ruby開(kāi)發(fā)的,所以它的配置語(yǔ)法也是Ruby的,每個(gè)項(xiàng)目都需要有一個(gè)Vagrantfile,在執(zhí)行vagrant init的目錄下可以找到該文件
二、Vagrantfile文件
# -*- 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|
# The most common configuration options are documented and commented below.
# For a complete reference, please see the online documentation at
# https://docs.vagrantup.com.
# Every Vagrant development environment requires a box. You can search for
# boxes at https://atlas.hashicorp.com/search.
config.vm.box = "centos7"
# Disable automatic box update checking. If you disable this, then
# boxes will only be checked for updates when the user runs
# `vagrant box outdated`. This is not recommended.
# config.vm.box_check_update = false
# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine. In the example below,
# accessing "localhost:8080" will access port 80 on the guest machine.
# config.vm.network "forwarded_port", guest: 80, host: 8080
# Create a private network, which allows host-only access to the machine
# using a specific IP.
# config.vm.network "private_network", ip: "192.168.33.10"
# Create a public network, which generally matched to bridged network.
# Bridged networks make the machine appear as another physical device on
# your network.
# config.vm.network "public_network"
# Share an additional folder to the guest VM. The first argument is
# the path on the host to the actual folder. The second argument is
# the path on the guest to mount the folder. And the optional third
# argument is a set of non-required options.
# config.vm.synced_folder "../data", "/vagrant_data"
# Provider-specific configuration so you can fine-tune various
# backing providers for Vagrant. These expose provider-specific options.
# Example for VirtualBox:
#
# config.vm.provider "virtualbox" do |vb|
# # Display the VirtualBox GUI when booting the machine
# vb.gui = true
#
# # Customize the amount of memory on the VM:
# vb.memory = "1024"
# end
#
# View the documentation for the provider you are using for more
# information on available options.
# Define a Vagrant Push strategy for pushing to Atlas. Other push strategies
# such as FTP and Heroku are also available. See the documentation at
# https://docs.vagrantup.com/v2/push/atlas.html for more information.
# config.push.define "atlas" do |push|
# push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME"
# end
# Enable provisioning with a shell script. Additional provisioners such as
# Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
# documentation for more information about their specific syntax and use.
# config.vm.provision "shell", inline: <<-SHELL
# apt-get update
# apt-get install -y apache2
# SHELL
end
可發(fā)現(xiàn)其中就兩行配置:
Vagrant.configure("2") do |config|
config.vm.box = "centos7"
這兩行就是我們?cè)趘agrant init中后面所指定的參數(shù)。由此可以看出,vagrant init只是幫我們生成了配置文件而已,換句話說(shuō),如果我們寫好了Vagrantfile,就不需要vagrant init,只需將準(zhǔn)備好的配置文件放入到所需目錄中,然后直接執(zhí)行vagrant up即可。
還有很多注釋掉的配置,那些都是一些常用的配置,包括網(wǎng)卡設(shè)置、IP地址、綁定目錄,甚至可以指定內(nèi)存大小、CPU個(gè)數(shù)、是否啟動(dòng)界面等等。如果需要,可以根據(jù)注釋文本進(jìn)行配置。
三、?配置詳解
下面是一些常用的配置:
config.vm.hostname:配置虛擬機(jī)主機(jī)名
config.vm.network:這是配置虛擬機(jī)網(wǎng)絡(luò),由于比較復(fù)雜,我們其后單獨(dú)討論
config.vm.synced_folder:除了默認(rèn)的目錄綁定外,還可以手動(dòng)指定綁定
config.ssh.username:默認(rèn)的用戶是vagrant,從官方下載的box往往使用的是這個(gè)用戶名。如果是自定制的box,所使用的用戶名可能會(huì)有所不同,通過(guò)這個(gè)配置設(shè)定所用的用戶名。
config.vm.provision:我們可以通過(guò)這個(gè)配置在虛擬機(jī)第一次啟動(dòng)的時(shí)候進(jìn)行一些安裝配置
需要注意的是,Vagrantfile文件只會(huì)在第一次執(zhí)行vagrant up時(shí)調(diào)用執(zhí)行,其后如果不明確使用vagrant reload進(jìn)行重新加載,否則不會(huì)被強(qiáng)制重新加載。
3.1、box設(shè)置
config.vm.box = "centos7"
該名稱是再使用 vagrant init 中后面跟的名字。
3.2、hostname設(shè)置
config.vm.hostname = "node1"
設(shè)置hostname非常重要,因?yàn)楫?dāng)我們有很多臺(tái)虛擬服務(wù)器的時(shí)候,都是依靠hostname來(lái)做識(shí)別的。比如,我安裝了centos1,centos2 兩臺(tái)虛擬機(jī),再啟動(dòng)時(shí),我可以通過(guò)vagrant up centos1來(lái)指定只啟動(dòng)哪一臺(tái)。
3.3、虛擬機(jī)網(wǎng)絡(luò)設(shè)置
config.vm.network "private_network", ip: "192.168.10.11"
//Host-only模式
config.vm.network "public_network", ip: "10.1.2.61"
//Bridge模式
Vagrant的網(wǎng)絡(luò)連接方式有三種:
▲NAT : 缺省創(chuàng)建,用于讓vm可以通過(guò)host轉(zhuǎn)發(fā)訪問(wèn)局域網(wǎng)甚至互聯(lián)網(wǎng)。
▲host-only : 只有主機(jī)可以訪問(wèn)vm,其他機(jī)器無(wú)法訪問(wèn)它。
▲bridge : 此模式下vm就像局域網(wǎng)中的一臺(tái)獨(dú)立的機(jī)器,可以被其他機(jī)器訪問(wèn)。
config.vm.network :private_network, ip: "192.168.33.10"
#配置當(dāng)前vm的host-only網(wǎng)絡(luò)的IP地址為192.168.33.10
host-only 模式的IP可以不指定,而是采用dhcp自動(dòng)生成的方式,如 :
config.vm.network "private_network", type: "dhcp”
#config.vm.network "public_network", ip: "192.168.0.17"
#創(chuàng)建一個(gè)bridge橋接網(wǎng)絡(luò),指定IP
#config.vm.network "public_network", bridge: "en1: Wi-Fi (AirPort)"
#創(chuàng)建一個(gè)bridge橋接網(wǎng)絡(luò),指定橋接適配器
config.vm.network "public_network"
#創(chuàng)建一個(gè)bridge橋接網(wǎng)絡(luò),不指定橋接適配器
3.4、同步目錄設(shè)置
config.vm.synced_folder "D:/xxx/code", "/home/www/"
前面的路徑(D:/xxx/code)是本機(jī)代碼的地址,后面的地址就是虛擬機(jī)的目錄。虛擬機(jī)的/vagrant目錄默認(rèn)掛載宿主機(jī)的開(kāi)發(fā)目錄(可以在進(jìn)入虛擬機(jī)機(jī)后,使用df -h 查看),這是在虛擬機(jī)啟動(dòng)時(shí)自動(dòng)掛載的。我們還可以設(shè)置額外的共享目錄,上面這個(gè)設(shè)定,第一個(gè)參數(shù)是宿主機(jī)的目錄,第二個(gè)參數(shù)是虛擬機(jī)掛載的目錄。
3.5、端口轉(zhuǎn)發(fā)設(shè)置
config.vm.network :forwarded_port, guest: 80, host: 8080
上面的配置把宿主機(jī)上的8080端口映射到客戶虛擬機(jī)的80端口,例如你在虛擬機(jī)上使用nginx跑了一個(gè)Go應(yīng)用,那么你在host上的瀏覽器中打開(kāi)http://localhost:8080時(shí),Vagrant就會(huì)把這個(gè)請(qǐng)求轉(zhuǎn)發(fā)到虛擬機(jī)里跑在80端口的nginx服務(wù)上。不建議使用該方法,因?yàn)樯婕岸丝谡加脝?wèn)題,常常導(dǎo)致應(yīng)用之間不能正常通信,建議使用Host-only和Bridge方式進(jìn)行設(shè)置。
guest和host是必須的,還有幾個(gè)可選屬性:
●guest_ip:字符串,vm指定綁定的Ip,缺省為0.0.0.0
●host_ip:字符串,host指定綁定的Ip,缺省為0.0.0.0
●protocol:字符串,可選TCP或UDP,缺省為TCP
3.6、定義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]/。
3.7、通用數(shù)據(jù) 設(shè)置一些基礎(chǔ)數(shù)據(jù),供配置信息中調(diào)用。
app_servers = {
:service1 => '192.168.33.20',
:service2 => '192.168.33.21'
}
這里是定義一個(gè)hashmap,以key-value方式來(lái)存儲(chǔ)vm主機(jī)名和ip地址。
3.8、配置信息
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,舊版本暫不考慮,記住就寫2即可。
do … end 為配置的開(kāi)始結(jié)束符,所有配置信息都寫在這兩段代碼之間。 config是為當(dāng)前配置命名,你可以指定任意名稱,如myvmconfig,在后面引用的時(shí)候,改為自己的名字即可。
3.9、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是通用的,常用的通用配置如下:
vb.name = "centos7"
#指定vm-name,也就是virtualbox管理控制臺(tái)中的虛機(jī)名稱。如果不指定該選項(xiàng)會(huì)生成一個(gè)隨機(jī)的名字,不容易區(qū)分。
vb.gui = true
# vagrant up啟動(dòng)時(shí),是否自動(dòng)打開(kāi)virtual box的窗口,缺省為false
vb.memory = "1024"
#指定vm內(nèi)存,單位為MB
vb.cpus = 2
#設(shè)置CPU個(gè)數(shù)
▲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"]
4.0、一組相同配置的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
4.1、provision任務(wù)
你可以編寫一些命令,讓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 命令字 代碼段,我們稱之為一個(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模式,命令只能在寫在一行中。
單行腳本使用的基本格式:
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é)點(diǎn)外面,寫入命名內(nèi)聯(lián)腳本:
$script = < 亚洲国产精品综合久久一线| 亚洲一区二区三区影院| 亚洲色在线无码国产精品不卡| 亚洲国产精品国自产拍AV| 国产精品xxxx国产喷水亚洲国产精品无码久久一区| 亚洲深深色噜噜狠狠网站| 亚洲精品韩国美女在线| 亚洲精品私拍国产福利在线| 久久精品国产亚洲av麻| 国产亚洲精品无码成人| 久久九九亚洲精品| 亚洲女初尝黑人巨高清| 亚洲国产精品无码AAA片| 亚洲va久久久噜噜噜久久狠狠| 久久亚洲精品视频| 亚洲AV无码久久精品狠狠爱浪潮| 亚洲成av人片天堂网| 亚洲视频在线播放| 亚洲在成人网在线看| 亚洲国产成人久久三区| 亚洲字幕AV一区二区三区四区| 亚洲一久久久久久久久| 亚洲a∨国产av综合av下载| 春暖花开亚洲性无区一区二区 | 日韩国产欧美亚洲v片 | 亚洲熟妇无码八V在线播放| 亚洲卡一卡二卡乱码新区| 男人天堂2018亚洲男人天堂| 亚洲日产乱码一二三区别| 在线观看亚洲电影| 亚洲综合图色40p| 久久久久无码精品亚洲日韩| 亚洲精品韩国美女在线| 亚洲自国产拍揄拍| 亚洲aⅴ无码专区在线观看| 亚洲一级片内射网站在线观看| 亚洲精品国产精品乱码在线观看| 久久久久久亚洲精品中文字幕| 亚洲毛片基地日韩毛片基地| 一本色道久久综合亚洲精品蜜桃冫 | 亚洲乱码一二三四区麻豆|