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机器就不会开启,你可以后续手动开启这台机器。

标签: vagrant