vagrant学习笔记-进阶篇
网络设置篇
所有的网络设置都在Vagrantfile
文件中的config.vm.network
方法中进行设置。
端口方式
端口方式可以将宿主机中的某个端口映射到虚拟机的某一个端口。
例如:如果你的程序在虚拟机中监听的是80端口,你可以进行如下配置,然后你就可以在宿主机中访问localhost:8080
访问你在虚拟机中的程序了。
Vagrant.configure("2") do |config|
config.vm.network "forwarded_port", guest: 80, host: 8080
end
CAUTION :你在host中定义的端口必须要大于1024。如果你想使用1024以内的端口,那就必须让vagrant以管理员权限运行,也就是sudo
,对于这种方法,vagrant官方是不建议采用的。
除此之外,你还可以指定
guest_ip
host_ip
protocol
参数以在指定的IP上绑定端口及设置协议信息(默认为TCP协议)。
私有网络方式
私有网络方式可以让你通过私有IP对虚拟机进行访问,多个虚拟机也可以通过私有网络互相访问。
DHCP
Vagrant.configure("2") do |config|
config.vm.network "private_network", type: "dhcp"
end
你可以进入虚拟机之后使用ifconfig
命令查看分配到的IP地址。
静态IP
Vagrant.configure("2") do |config|
config.vm.network "private_network", ip: "192.168.50.4"
end
你可以通过手动设置auto_config
的值禁止vagrant进行自动配置。
Vagrant.configure("2") do |config|
config.vm.network "private_network", ip: "192.168.50.4",
auto_config: false
end
共有网络方式
顾名思义,共有网络就是指你可以让公共网络上的用户来访问你的虚拟机。
CAUTION :截止文章发布时,官方称在后续版本中,共有网络方式会被:bridged
替代,望读者使用本功能前,先查看官方文档。
CAUTION :因为vagrant的镜像在设计的时候没有考虑安全问题,故请您在将您的虚拟环境发布至公开网络前,务必确认安全设置(包括但不限于:登录密码,密钥,root权限登陆)已经设置良好。
DHCP
Vagrant.configure("2") do |config|
config.vm.network "public_network"
end
静态IP
config.vm.network "public_network", ip: "192.168.0.17"
默认网络接口
如果在你的宿主机上有一个以上的网络接口,vagrant将会询问你连接到哪一个接口,当然你也可以预先在Vagrantfile
文件中进行设置:
config.vm.network "public_network", bridge: 'en1: Wi-Fi (AirPort)'
bridge
选项后面的名称应该与本地网络接口相匹配,否则vagrant将会让你手动选择接口。
文件同步篇
所有的文件同步设置都在Vagrantfile
文件中的config.vm.synced_folder
方法中进行设置。
Vagrant.configure("2") do |config|
config.vm.synced_folder "src/", "/srv/website"
end
第一个参数指的是宿主机上文件夹的路径,如果是相对路径,那就是相对于项目根目录的;第二个参数指的是虚拟机上的路径,必须是绝对路径,如果你输入的路径不存在,则会自动创建。
可选参数
- create(默认:假):如果设置为真且设置的宿主文件夹路径不存在,则会自动创建。
disabled:如果设置为真,则当前文件夹不会被链接入虚拟环境。
config.vm.synced_folder "src/", "/srv/website", disabled: true
- group(默认:ssh用户):设置的用户组将拥有指定文件夹。
owner(默认:ssh用户):设置的用户将拥有指定文件夹。
config.vm.synced_folder "src/", "/srv/website",owner: "root", group: "root"
- mount_options:这里设置的选项将会传递给
mount
命令。 - type:文件夹的文件系统,如果不指定,vagrant会自动使用最优方案。
脚本执行篇
你可以编写一些命令,让vagrant在启动虚拟机的时候自动执行,这样你就可以省去手动配置环境的时间了。
脚本何时会被执行
- 第一次执行
vagrant up
命令 - 执行
vagrant provision
命令 - 执行
vagrant reload --provision
或者vagrant up --provision
命令
你也可以在启动虚拟机的时候添加
--no-provision
参数以阻止脚本被执行
设置
使用config.vm.provision
方法进行配置
Vagrant.configure("2") do |config|
config.vm.provision "shell", inline: "echo hello"
end
文件操作
Vagrant.configure("2") do |config|
config.vm.provision "file", source: "~/.gitconfig", destination:".gitconfig"
end
与文件同步不同的是,这样的操作不会同步本地和虚拟环境中的文件,只会将本地的文件复制到虚拟机中对应的路径。
命令语句
你可以使用inline
或者path
方式进行设置。
Vagrant.configure("2") do |config|
config.vm.provision "shell", inline: "echo Hello, World"
end
Vagrant.configure("2") do |config| config.vm.provision "shell", path: "script.sh" end
更多方式请查阅官方文档
多主机篇
你可以在一个Vagrantfile
文件里建立多个虚拟机,一般情况下,你可以用多主机功能完成以下任务:
- 分布式的服务,例如网站服务器和数据库服务器
- 分发系统
- 测试接口
- 灾难测试
建立
使用config.vm.define
方法进行配置:
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
使用define为某一台虚拟机定义了一个名称,你可以在后文使用这个别名来配置这台虚拟机。
设置
当你定义了多主机之后,在使用vagrant
命令的时候,就需要加上主机名,例如vagrant ssh web
;也有一些命令,如果你不指定特定的主机,那么将会对所有的主机起作用,比如vagrant up
;你也可以使用表达式指定特定的主机名,例如vagrant up /follower[0-9]/
。
通信
为了使你的主机们可以相互交换数据,你可以使用私有网络
方式为你的虚拟机们建立一个私有网络。
指定主要的虚拟机
你可以使用primary
属性指定某一个虚拟机为主要的机器,你只可以指定一台机器为主要机器。
config.vm.define "web", primary: true do |web|
# ...
end
自动启动设置
使用autostart
属性可以为虚拟机设置是否自动启动,如果某台机器的autostart
属性被设置为false
,那么在执行vagrant up
命令的时候,这台机器就不会被开启。
config.vm.define "web"
config.vm.define "db"
config.vm.define "db_follower", autostart: false
例如上面的配置,在执行vagrant up
命令的时候,db_follower
机器就不会开启,你可以后续手动开启这台机器。