Vagrant冒险记(一)

Vagrant冒险记(一)

1.Vagrant简要介绍

Vagrant实际上一套虚拟机管理工具,基于Ruby开发,底层支持VirtualBox、VMware甚至AWS、Docker等作为虚拟化系统。我们可以通过Vagrant封装一个Linux的开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行。Vagrant本身并没有能力创建虚拟机,它是调用一些虚拟化工具来创建,如HyperV、VirtualBox, VMWare。

2.Vagrant快速上手

通常的做法是命令行直接初始化并启动虚拟机,由于网络原因拉取vagrant cloud的box文件经常会失败,实际测试时先手动下载box文件,再通过vagrant box add添加本地box文件,后续流程不变。

注意:笔者测试环境采用Windows的HyperV作为Vagrant的Provider,box镜像是Ubuntu22.04版本!

image-20240914200349768

通过自带的Hyper-V管理器查看刚刚创建的虚拟机,包括虚拟机名称、状态、CPU使用率、内存分配、运行时间等。

image-20240914200440323

3.Vagrant基本操作

image-20240914210926138

Vagrant的基础操作包括启动、查看状态、SSH连接、暂停、恢复、重启、关闭、销毁虚拟机。

image-20240914210649379

4.Vagrant配置文件

查看一下Vagrant相关的文件,包括Vagrantfile和虚拟机相关数据文件

image-20240914212119092

启动一个CentOS7的虚拟机实例,查看相关的Vagrantfile的内容,初始创建的Vagrantfile中只有下面三行:

1
2
3
Vagrant.configure("2") do |config|
config.vm.box = "centos7"
end

image-20240914214346233

增加Vagrantfile的配置项config.vm.hostname,重新加载并启动虚拟机实例,更多配置项见config.vm-Vagrantfile

1
2
3
4
Vagrant.configure("2") do |config|
config.vm.box = "centos7"
config.vm.hostname = "vagrant-demo"
end

image-20240914215513446

关于SSH连接的小知识:默认Vagrant使用虚拟机实例特定的非对称密钥对进行安全连接,即虚拟机实例内部提前插入公钥,Vagrant保存私钥,保证安全无密码登录。

image-20240915105309237

image-20240915105537212

增加Vagrantfile的配置项config.ssh.insert_key,重新加载并启动虚拟机实例,更多配置项见config.ssh-Vagrantfile

1
2
3
4
>Vagrant.configure("2") do |config|
config.vm.box = "centos7"
config.ssh.insert_key = false
>end

image-20240915110602043

Vagrant如何使用一个Vagrantfile创建多个不同Host呢,其实需要config.vm.define配置项:

1
2
3
4
5
6
7
8
9
10
11
12
13
Vagrant.configure("2") do |config|
# 全局配置
config.vm.box = "centos7"
config.vm.hostname = "test"
# 具体Host配置
config.vm.define "web-server" do |web|
web.vm.hostname = "web"
end
# 具体Host配置
config.vm.define "database" do |db|
db.vm.hostname = "db"
end
end

image-20240915112124911

image-20240915112447958

使用Ruby的循环语法优化上面的Vagrantfile:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
host_lit = [
{
:name => "web-server",
:box => "centos7",
:hostname => "web"
},
{
:name => "database",
:box => "centos7",
:hostname => "db"
}
]
Vagrant.configure("2") do |config|
host_list.each do |item|
config.vm.define item[:name] do |host|
host.vm.box = item[:box]
host.vm.hostname = item[:hostname]
end
end
end

利用SMB实现主机与虚拟机实例共享文件夹,需要新增配置项config.vm.synced_folder

1
2
3
4
5
Vagrant.configure("2") do |config|
config.vm.box = "centos7"
config.vm.hostname = "test"
config.vm.synced_folder ".", "/vagrant", type: "smb"
end