Vagrant安装和使用教程
2018年02月03日

下载安装 vagrant 和 virtualbox 安装没什么说的都选默认就行

安装好这两个东西后 virtualbox 就不用管了因为它会随着 vagrant 而启动

打开命令行 输入命令 vagrant -v 可以看到vgrant版本。

添加vagrant box, 其实就是就是虚拟系统, vagrant box add {url}


{url} 是vagrant box 的地址, vagrant box 没有国内源,用vpn到

    官方镜像:https://vagrantcloud.com/boxes/search

    或者第三方仓库:http://www.vagrantbox.es/ 找合适的box 

建议先翻墙出去把box下载到本地,然后再进行安装。

例如我找到的地址为:(CentOS 7 x86_64 minimal installation)https://atlas.hashicorp.com/viniciusfs/boxes/centos7/

另外一个box链接:https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box

把下载好的box, cd 到下载文件夹文件夹, 然后运行命令vagrant box add centos7 Vagrant-CentOS-7.box 


官方文档参见:https://www.vagrantup.com/docs/cli/reload.html


# 安装box

$ vagrant box add CentOs7 /Users/vagrant/centos-7.0-x86_64.box

box中的镜像文件被放到了: C:\Users\当前用户名.vagrant.d\boxes\目录下。


运行vagrant box list就能看见创建好的实例了


cd 到一个新建的文件夹中

mkdir centos7

cd centos7

执行vagrant init centos7(这里因为我实例取的名字叫centos7), 

在该文件夹中会自动生成Vagrantfile这个文件 


打开Vagrantfile 

1、取消config.vm.network "private_network"的注释, ip可以自定义但是建议不要以1结尾, 有未知错误, 我的是’192.1.1.0’ 

通过这个IP就可以访问你的Linux主机了


2、默认情况下,当前的工作目录,会被映射到虚拟机的 /vagrant 目录,当前目录下的文件可以直接在 /vagrant 下进行访问,当然也可以在通过 ln 创建软连接,如

ln -fs /vagrant/wwwroot /var/www

来进行目录映射,另外还可以配置其他同步目录:

    取消config.vm.synced_folder的注释, 第一个参数是本机想要挂载的目录, 第二参数是Linux目标目录 

    我是这样配置的 config.vm.synced_folder “D:/workspace”, “/workspace”


现在运行vagrant up启动virtualbox, 第一次运行需要选择虚拟机, 选virtualbox就行, 

语法:vagrant up 虚拟机名称,如果不指定名称 默认名称为“default”

第一次执行 vagrant up时会初始化虚拟机。

启动提示如下:

$ vagrant up

Bringing machine 'default' up with 'virtualbox' provider...

==> default: Importing base box 'viniciusfs/centos7'...

==> default: Matching MAC address for NAT networking...

==> default: Checking if box 'viniciusfs/centos7' version '1.0.1' is up to date...

==> default: Setting the name of the VM: centos7_default_1547436759779_1217

    default: SSH address: 127.0.0.1:2222

    default: SSH username: vagrant

    default: SSH auth method: private key

然后运行vagrant ssh就可以进入Linux服务器了

或者使用第三方如xshell,ip地址是:localhost(或127.0.0.1),端口,需要观察,映射的22端口是多少。一般是2200 或者2222 

用户名与密码均是: vagrant


更新Vagrant的虚拟机

另外,如果想修改 Vagrantfile,需要reload或者关闭再启动,如下:

$ vagrant reload

等价于:

$ vagrant halt

$ vagrant up


Vagrant中有下面一段内容:

# 使用shell脚本进行软件安装和配置

node.vm.provision "shell", inline: <<-SHELL

# 安装docker 1.11.0

wget -qO- https://get.docker.com/ | sed 's/docker-engine/docker-engine=1.11.0-0~trusty/' | sh

usermod -aG docker vagrant

SHELL

这个脚本默认只在第一次启动(vagrant up)时执行。

修改此段内容之后,要重新执行这个脚本需要使用”–provision”选项。

$ vagrant halt

$ vagrant up --provision

或者 

$ vagrant reload --provision


1. vagrant box基本命令

列出本地环境中所有的box

vagrant box list

添加box到本地vagrant环境

vagrant box add box-name(box-url)

更新本地环境中指定的box

vagrant box update box-name

删除本地环境中指定的box

vagrant box remove box-name

重新打包本地环境中指定的box

vagrant box repackage box-name

在线(https://app.vagrantup.com/boxes/search)查找需要的box


vagrant的命令详解

命令 作用

vagrant box add 添加box的操作

vagrant init 初始化box的操作,会生成vagrant的配置文件Vagrantfile

vagrant up 启动本地环境

vagrant ssh 通过 ssh 登录本地环境所在虚拟机

vagrant halt 关闭本地环境

vagrant suspend 暂停本地环境

vagrant resume 恢复本地环境

vagrant reload 修改了 Vagrantfile 后,使之生效(相当于先 halt,再 up)

vagrant destroy 彻底移除本地环境

vagrant box list 显示当前已经添加的box列表

vagrant box remove 删除相应的box

vagrant package 打包命令,可以把当前的运行的虚拟机环境进行打包

vagrant plugin 用于安装卸载插件

vagrant status 获取当前虚拟机的状态

vagrant global-status 显示当前用户Vagrant的所有环境状态


2. 网络配置

vagrant支持以下三种网络配置:


Forwarded port(端口映射)

是指将宿主计算机的端口映射到虚拟机上的某个端口上,访问宿主计算机的该端口时,请求实际会被转发到虚拟机上指定的端口,配置文件设置语法为:


config.vm.network :forwarded_port, guest: 80, host: 8889

优点:简单、容易理解、容易实现外网访问虚拟机。


缺点:需映射很多端口时较麻烦、不支持在宿主机器上使用小于1024的端口来转发(如:不能使用SSL的443端口来进行https连接)。


官网配置文档地址:https://www.vagrantup.com/docs/networking/forwarded_ports.html


Private network(私有网络)

这种网络配置下,只有主机可以访问虚拟机,如果多个虚拟机设置定在同一个网段也可以相互访问,当然虚拟机也是可以访问外部网络的。配置语法如下:


config.vm.network "private_network", ip: "192.168.50.4" # 固定IP

还可以设置动态IP,配置语法如下:


config.vm.network "private_network", type: "dhcp"

优点:安全,只能自己访问。


缺点:因私有原有,所以其他团队成员不能和你协作。


官网配置文档地址:https://www.vagrantup.com/docs/networking/private_network.html


Public network(公有网络)

这种配置下,虚拟机享受实体机一样的待遇,一样的网络配置,vagrant 1.3版本以后这种配置也支持设定固定IP,配置语法如下:


config.vm.network "public_network", ip: "192.168.50.4"

还可以设置桥接网卡,配置语法如下:


config.vm.network "public_network", bridge: "en1: Wi-Fi (AirPort)"

优点:方便团队协作,别人可以访问你的虚拟机。


缺点:需要有网络,有路由器分配IP


官网配置文档地址:https://www.vagrantup.com/docs/networking/public_network.html


3.共享目录

  有时候,我们希望虚拟机能和我们的主机共享一些文件夹,这时候在vagrant的配置文件中进行配置来达到共享目录的目的。


vagrant的共享目录类型有:


NFS (适用于Mac OS宿主机), 配置语法:


config.vm.synced_folder "/hostPath", "/guestPath", type: "nfs"

官网配置文档地址:https://www.vagrantup.com/docs/synced-folders/nfs.html


RSync , 配置语法:


config.vm.synced_folder "/hostPath", "/guestPath", type: "rsync"

官网配置文档地址:https://www.vagrantup.com/docs/synced-folders/rsync.html


SMB (适用于Windows宿主机), 配置语法:


config.vm.synced_folder "/hostPath", "/guestPath", type: "smb"

官网配置文档地址:https://www.vagrantup.com/docs/synced-folders/smb.html


VirtualBox

如果你的vagrant使用virtualbox的provider,这是默认的共享目录的类型。这些同步文件夹使用ValualBox共享文件夹系统将文件更改从客户机同步到主机,反之亦然。


官网配置文档地址:https://www.vagrantup.com/docs/synced-folders/virtualbox.html


注意:配置完成,我们重新启动虚拟机时发现报错了,这时候别慌,我们给出解决办法传送门


4. 虚拟机优化

自定义虚拟机名称


config.vm.provider "virtualbox" do |vb|

    vb.name = "ubuntu-hafiz"

end

自定义虚拟机主机名称


config.vm.hostname="hafiz"

自定义虚拟机内存和CPU


config.vm.provider "virtualbox" do |vb|

  vb.name = "ubuntu-imooc"

  vb.memory = "1024"

  vb.cpus = 2

end

配置好后重启虚拟机:

vagrant halt

vagrant up

然后进入虚拟机:

使用top命令然后再按1显示当前CPU个数。


5. 打包分发

  当我们基于一个box启动一个虚拟机以后,我们在里面部署了专属自己的环境,那这个时候我们想要把自己的这套配置好的环境共享给别人怎么办呢?答案是将虚拟机打包分发。


当你配置好开发环境后,退出并关闭虚拟机。在终端里,对虚拟机打包

$ vagrant halt         // 在开发环境的目录,关闭centos7

$ vagrant status       // 确认centos7关机


方式一:导出packaging a VirtualBox machine that Vagrant manages

$ vagrant package machine名称 --output  自定义名称.box  --vagrantfile Vagrantfile

// --output:(可选)设置通过NAME来指定输出的文件名;

// --vagrantfile:(可选)将Vagrantfile文件直接封进box中

machine名称,在C:\Users\用户\.vagrant.d\data\machine-index\index 文件中查找,例如我的内容如下:

{
  "local_data_path": "D:/0sync-local/vgrantbox/centos7/.vagrant",
  "name": "default",
  "provider": "virtualbox",
  "state": "poweroff",
  "vagrantfile_name": null,
  "vagrantfile_path": "D:/0sync-local/vgrantbox/centos7",
  "updated_at": null,
  "extra_data": {
    "box": {
      "name": "viniciusfs/centos7",
      "provider": "virtualbox",
      "version": "1.0.1"
    }
  }
}

这里面的name即为machine名称,默认为default


方式二:导出packaging a VirtualBox machine that VirtualBox manages

首先找到VirtualBox的安装位置,我的VirtualBox安装在E:\Program Files\Oracle\VirtualBox,这个目录下,我们使用cmd(注意是CMD,是CMD,是CMD,重要的话说三遍)进入这个目录,执行命令

vboxmanage list vms

列表展示已经安装的虚拟机

$ vboxmanage list vms

"centos7_default_1547436759779_1217" {45904afe-c88d-494d-9364-9c5d9ceef38a}

然后

vagrant package --base centos7_default_1547436759779_1217 --output 你定义的别名.box


注:如果网络模式中使用private_network的话,在打包之前需要清除一下private_network的设置,避免不必要的错误:

rm -f /etc/udev/rules.d/70-persistent-net.rules

打包完成后会在当前目录生成一个centos7.box的文件,将这个文件分发给其他用户(开发者)。


其他用户只要添加这个 box ,并用其初始化自己的开发目录,就能得到一个一模一样的开发环境了。

# vagrant box add centos7 centos7.box       

//添加package.box,镜像命名为centos7

如果命名为base,则表示指定默认的box,使用base时,之后可以直接使用 vagrant init 进行初始化,如果自行指定名称,则初始化的时候需要指定box的名称。

$ vagrant init centos7      

// 初始化centos7镜像

$ vagrant up


Vagrant 手册之多个虚拟机 multi-machine

原文地址

Vagrant 可以通过一个 Vagrantfile 定义并控制多个客户机。这就是所谓的“multi-machine”多虚拟机环境。

这些机器通常可以协同工作,或者互相关联。下面是几个常见用例:

  • 准确建模多服务器生产拓扑环境,例如分离 Web 和数据库服务器。

  • 建模分布式系统,以及它们如何相互交互。

  • 测试一个接口,比如一个 API 到一个服务组件。

  • 灾难情况测试:机器宕机,网络分区,网络缓慢,环境不一致(inconsistent world views)等。

以前,通常是在一台机器上来模拟运行这样的复杂环境。不准确。

使用 Vagrant 的多客户机功能,可以在单个 Vagrant 环境中对这些环境进行建模,而不会失去 Vagrant 的任何好处。

1. 定义多个机器

多个机器定义在同一个项目的 Vagrantfile 文件中,使用 config.vm.define 方法调用。这个配置指令挺有趣的,因为它可以在一个配置中创建 Vagrant 配置。例如:

Vagrant.configure("2") do |config|
  config.vm.provision "shell", inline: "echo Hello"

  config.vm.define "web" do |web|
    web.vm.box = "apache"
  end

  config.vm.define "db" do |db|
    db.vm.box = "mysql"
  end
end1234567891011

config.vm.define 是一个包含另一个变量的块。这个变量,比如上面的 web 变量,和配置变量完全相同,但是内部变量使用的任何配置只适用于被定义的机器。因此,web 上的任何配置只会影响 web 这个机器。(As you can see, config.vm.define takes a block with another variable. This variable, such as web above, is the exact same as the config variable, except any configuration of the inner variable applies only to the machine being defined. Therefore, any configuration on web will only affect the web machine.)

而且重要的是,你可以继续使用配置对象。配置对象在特定于机器的配置之前加载并合并,就像 Vagrantfile 加载顺序 中的其他 Vagrantfile 一样。

如果你熟悉编程,这就类似语言中的不同的变量作用域。

在使用这些作用域时,执行顺序(例如 provision 的顺序)变得重要。Vagrant 按照 Vagrantfile 中列出的顺序执行外部输入。例如,使用下面的 Vagrantfile:

Vagrant.configure("2") do |config|
  config.vm.provision :shell, inline: "echo A"

  config.vm.define :testing do |test|
    test.vm.provision :shell, inline: "echo B"
  end

  config.vm.provision :shell, inline: "echo C"end123456789

这种情况下的提供者 provisioner 将输出“A”,然后输出“C”,然后输出“B”。 注意“B”是最后一个。这是因为排序是按照文件中的顺序排序(That is because the ordering is outside-in, in the order of the file.)。

如果你想在多台机器上应用稍微不同的配置,请参阅 [此提示]

2. 控制多个机器

在 Vagrantfile 中定义了多台机器时,各种 vagrant 命令的用法稍有变化。

只有单个机器(如 vagrant ssh)才有意义的命令现在需要机器的名称来控制。使用上面的例子,变为 vagrant ssh web 或 vagrant ssh db

其他命令(如 vagrant up)默认在每台机器上运行。所以如果你运行 vagrant up 命令,Vagrant 会启动 web 和 DB 两个机器。也可以通过 vagrant up web 或 vagrant up db 命令启动特定机器。

此外,可以指定一个正则表达式来仅匹配某些机器。这在指定很多类似机器的情况下很有用,例如,如果正在测试一个分布式服务,可能有一个 leader 机器以及 follower0,follower1,follower2 等。如果想启动所有 follower,而不是 leader,可以做 vagrant up /follower[0-9]/。如果 Vagrant 在正斜杠内看到一个机器名称,会认为正在使用正则表达式。

3. 机器之间通信

为了促进多机器间的通信,应使用各种网络选项。特别是,专用网络(private network)可用于在多台机器和主机之间建立专用网络。

4. 指定主机

可以指定一台主机。当未指定多机环境中的特定机器时,主机将成为默认机器。

要指定默认机器,只需在定义它时将其标记为 primary。只能指定一台主机。

config.vm.define "web", primary: true do |web|  # ...end123

5. 自动启动机器

默认情况下,在多机器环境中,vagrant up 将启动所有定义的机器。自动启动设置允许你告诉 Vagrant 不启动特定机器。例:

config.vm.define "web"config.vm.define "db"config.vm.define "db_follower", autostart: false123

当使用上述设置运行 vagrant 时,Vagrant 将自动启动“web”和“db”机器,但不会启动“db_follower”。可以通过运行 vagrant up db_follower 手动强制启动“db_follower”机器。


一个例子:

https://github.com/UtahDave/salt-vagrant-demo/blob/master/Vagrantfile

https://blog.csdn.net/watermelonbig/article/details/80796264