一、Vagrant是什么

vagrant是一个操作虚拟机的工具.是一个基于Ruby的工具,用于创建和部署虚拟化开发环境。通过命令和配置文件来管理虚拟机,很快就能完成一套开发环境的部署,并可以打包传播,统一了开发环境,也解决了重复配置环境的麻烦.

二、Vargant的好处

1.Vagrant会创建共享文件夹,用来在主机和虚拟机之间进行资源共享;
2.Vagrant通过添加box镜像进行快速部署,部署完毕后可以通过package进行打包分发,避免二次重建环境;
3.Vagrant可以使用puppet、chref等管理工具进行自动化配置部署;
4.Vagrant支持单机模拟多台机器,且支持一个配置文件Vagrantfile就可以跑分布式系统。

三、准备工作

需要先安装好 VagrantVirtualBox

win7下建议安装版本
1.vagrant_1.8.6.msi
2.VirtualBox-5.1.24-117012-Win.exe

win10下建议安装版本
1.vagrant_2.2.14_x86_64.msi
2.VirtualBox-6.6.16-140961-Win.exe

四、构建CentOS7虚拟机

4.1 查找

https://app.vagrantup.com/boxes/search 下搜索centos:

4.2 安装准备

然后在win10任意盘符下创建Vagrant_vm_centos目录(注意目录最好不要有中文和空格)

4.3 安装

这里我们使用离线安装,如4.1截图,点击【virtualbox】后面的按钮下载离线安装包,下载后拷贝到上面新创建的目录,改名为centos7.box。执行以下命令加载镜像文件到Vagrant中去:

vagrant box add centos7 centos7.box

centos7是给虚拟机起的名字 ,随意写。然后可以通过以下命令查看,当前vagrant下有那些可用:

vagrant box list

初始化虚拟机:

vagrant init centos7

执行完成之后会生成一个Vagrantfile文件,该文件就是Vagrant的配置文件。

我们先用vagrant status命令查看一下虚拟机的状态、我们可以执行vagrant halt来关闭虚拟机:

启动虚拟机的命令为vagrant up,我们也可以使用vagrant suspend命令来暂停运行中的虚拟机,以保持它的运行状态。暂停后可以使用vagrant resume命令来恢复虚拟机:

五、连接虚拟机

5.1 直接连接

连接正在运行中的虚拟机的命令为vagrant ssh:

5.2 ssh连接

我们在启动时候,发现默认已经开启了ssh连接,并且是公钥连接方式,如下图:

这个时候,我们打开xshell,填写基本的连接信息

在身份验证的时候,我们选择私钥方式

添加公钥,默认路径在虚拟机的安装目录下面 .vagrant\machines\default\virtualbox目录下

选择添加的私钥后,登陆如下:

注意:root帐号默认密码为vagrant,如果关闭私钥直接使用密码登陆,需要设置/etc/ssh/sshd-config 中的PasswordAuthentication为yes。

六、目录共享

Vagrant的根目录(就是我们一开始创建的vagrant_vm)和虚拟机里的/vagrant目录是共享的。最开始启动时候日志如下:

那么我们如何通过命令修改为自己的目录呢?

6.1 修改配置文件

虚拟机的配置文件默认就在Vagrant_vm_centos的目录下的Vagrantfile。我们增加如下配置:

config.vm.synced_folder "E:\Program\Vagrant_vm_centos\data", "/vagrant", type: "virtualbox"

6.2 挂载并安装VBoxGuestAdditions

直接在VirtualBox中启动虚拟机,如下所示进行登录:

挂载办法如下所示:设备->安装增强功能

一般会提示无法分配错误,这个时候就需要我们手动挂载了。手动安装下,在VirtualBox安装目录下找到VBoxGuestAdditions.iso

加载进来,之后重启下,使用以下命令安装VBoxGuestAdditions

mkdir /opt/cdrom
mount /dev/cdrom /opt/cdrom
cd /opt/cdrom/
./VBoxLinuxAddtions.run


发现还是不行,然后又执行以下命令更新了下系统

yum update
yum install gcc
yum install kernel-devel
yum install xorg-x11-server-Xorg

然后还需要安装插件: vagrant-vbguest
关闭虚拟机,执行:

vagrant plugin install vagrant-vbguest

执行完成后,启动虚拟机在执行

./VBoxLinuxAddtions.run

之后重启:

6.3 共享测试

七、网络配置

7.1 私网配置

配置Vagrantfile

在Vagrantfile里打开下面这行配置

重启虚拟机

然后使用命令vagrant reload重启虚拟机,重启后我们使用ping命令看是否可以在windows上访问到这个ip:

访问成功,连接虚拟机,使用ifconfig查看其IP:

7.2 公网配置

在Vagrantfile里打开下面这行配置

网络环境选择

然后重启虚拟机,重启过程中会然你根据当前网络环境选择:

因为我的本地有线网和无线网全部连接,选择wifi所以选择第二个选项,重启好后连接虚拟机,查看其IP:

新开一个xshell窗口,ping 这个地址看是否能通:

八、多主机配置

8.1 多主机安装

使用Vagrant可以轻松地创建多台虚拟主机。下面我们开始通过Vagrant来创建两台新的虚拟主机“node01”和“node02”。创建Vagrant_vm_centos_multi目录,然后通过现有的box来初始化一个Vagrantfile配置:

接着编辑multi目录下的Vagrantfile文件,新增下面两项配置:

1
2
3
4
5
	config.vm.define "node01" do |node01|
end

config.vm.define "node02" do |node02|
end

运行vagrant status:

可以看到多了两台状态为not created的虚拟机,名称分别为“node01”和“node02”。

我们可以使用vagrant up来启动两台主机,也可以通过vagrant up node01来单独启动“node01”这台虚拟主机。

启动后(第一次启动耗时可能比较长),使用vagrant status来查看它们的状态:

通过vagrant ssh 主机名就可以连接上它们了。然后我们参考章节 6.2 ,给两台虚拟机安装VBoxGuestAdditions。

8.2 网络配置

修改Vagrantfile

1
2
3
4
5
6
7
	config.vm.define "node01" do |node01|
node01.vm.network "private_network", ip: "192.168.33.11"
end

config.vm.define "node02" do |node02|
node02.vm.network "private_network", ip: "192.168.33.12"
end

值得注意的是,在配置私有网络的时候,IP网段不能和Windows主机相同。

测试

配置好后重启这两台虚拟机,然后分别连接这两台虚拟机,看是否能够ping通:

配置成功。

8.3 自定义主机名

修改Vagrantfile

1
2
3
4
5
6
7
8
9
	config.vm.define "node01" do |node01|
node01.vm.network "private_network", ip: "192.168.33.11"
node01.vm.hostname = "node01"
end

config.vm.define "node02" do |node02|
node02.vm.network "private_network", ip: "192.168.33.12"
node02.vm.hostname = "node02"
end

测试

重启后,连接虚拟机,可以看到hostname已经修改为我们设置的名称了:

8.4 多主机的共享目录

默认的这两台虚拟主机的/vagrant和当前目录Vagrant_vm_centos_multi/是共享的。我们也可以分别为它们设置不同的共享目录。

配置Vagrantfile

编辑Vagrantfile,添加如下配置:

1
2
3
4
5
6
7
8
9
10
11
	config.vm.define "node01" do |node01|
node01.vm.network "private_network", ip: "192.168.33.11"
node01.vm.hostname = "node01"
node01.vm.synced_folder "E:\\Program\\VirtualBox VMs\\Vm_share", "/vagrant", type: "virtualbox"
end

config.vm.define "node02" do |node02|
node02.vm.network "private_network", ip: "192.168.33.12"
node02.vm.hostname = "node02"
node02.vm.synced_folder "E:\\Program\\VirtualBox VMs\\Vm_share", "/vagrant", type: "virtualbox"
end

然后重启这两台虚拟主机就好了。

测试

九、命令汇总

命令描述
vagrant init初始化vagrant,这会创建一个Vagrantfile文件
vagrant up启动vagrant,这启动virtualbox虚拟机
vagrant halt停止vagrant ,这会停止virtualbox虚拟机
vagrant suspend暂停运行中的虚拟机,以保持它的运行状态
vagrant resume恢复虚拟机
vagrant destroy这会彻底删除当前工作目录下的vagrant
vagrant reload重新加载Vagrantfile文件,在每次修改完Vagrantfile文件之后都要执行
vagrant provision重新执行初始化脚本,在每次修改完初始化脚本文件之后都要执行。初始化脚本文件可以在Vagrantfile中指定,后面会讲到
vagrant ssh登录到vagrant
vagrant ssh-config查看登录配置,包括用户名,私钥存放地址等
vagrant box add添加box的操作
vagrant box list显示当前已经添加的box列表
vagrant box remove删除相应的box
vagrant package打包命令,可以把当前的运行的虚拟机环境进行打包
vagrant plugin用于安装卸载插件
vagrant status获取当前虚拟机的状态
vagrant global-status显示当前用户Vagrant的所有环境状态

更多参考:
https://mrbird.cc/Create-Virtual-Machine-By-Vagrant.html
https://blog.csdn.net/u011781521/article/details/80275212

更多Vagrant的配置可以查看官方文档: https://www.vagrantup.com/docs/