Vagrant
Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境。它使用Oracle的开源VirtualBox虚拟化系统,使用 Chef创建自动化虚拟环境。
安装Vagrant
从Vagrant官网下载安装包,执行安装。
安装VirtualBox
从官网下载VirtualBox,执行安装,设置虚拟机的安装位置,默认会安装在C盘,避免系统盘资源占用。
注册Vagrant引导文件
box是Vagrant环境的包格式。您可以在Vagrantfile
中指定一个box环境和操作配置。您可以在任何受支持的平台上使用一个box来启动相同的工作环境。为了使团队能够使用和管理相同的盒子,支持版本。
最快的入门方法是从Vagrant Cloud上的公开目录中选择一个预定义的盒子环境。您还可以在Vagrant Cloud上添加和共享您自己的定制盒子。
这里安装Centos7,可以从Vagrant Cloud中找到对应的安装步骤,
打开cmd,执行上述命令,会在C:/User/DoGH
目录下创建一个vagrantfile
文件,Vagrant会以该文件为引导,创建系统。
vagrant init centos/7
vagrant up
执行vagrant up
自动安装并启动centos系统。
第一次需要下载系统所以较为缓慢。
等待启动完成后,可以在VirtualBox中看到该虚拟机的配置信息。
当下次需要启动虚拟机时,可以在cmd中执行vagrant up
命令启动虚拟机或在VirtualBox中直接启动和关闭。
用户管理
Vagrant创建的虚拟机自带一个普通用户vagrant
密码也是vagrant
,在cmd中也可以通过vagrant ssh
命令自动登录该用户,
在默认情况下,使用ssh连接工具访问虚拟机时需要身份文件和密码双重登录,这里可以在cmd中输入vagrant ssh-config
命令,打印他的ssh连接信息,
Host default
HostName 127.0.0.1
User vagrant
Port 2222
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile C:/Users/DoGH/.vagrant/machines/default/virtualbox/private_key
IdentitiesOnly yes
LogLevel FATAL
PubkeyAcceptedKeyTypes +ssh-rsa
HostKeyAlgorithms +ssh-rsa
IdentityFile
就是身份文件的位置,选择该文件,在输入用户名和密码即可登录vagrant用户。
在登录了虚拟机后,切换至root用户,并设置登录密码
# 切换至root用户
sudo -i
# 设置密码
passwd
为了能直接使用用户名密码登录虚拟机,需要修改/etc/ssh/sshd_config
文件,开启该两项配置。
PermitRootLogin yes
PasswordAuthentication yes
该文件需要root用户登录才能被修改。
重启ssh服务,再通过连接工具连接时就不需要身份文件的验证
sudo systemctl restart sshd
Vagrantfile
vagrantfile的主要功能就是描述项目所要求的设备类型,并且如何配置和提供这些设备。
Vagrant主要依靠每个项目的Vagrantfile文件运行,并且Vagrantfile版本管理。这就允许其他参与项目的开发人员获得Vagrantfile文件,只需要执行vagrant up
,就可以创建相同的设备。Vagrantfiles可以在Vagrant支持的每个平台上移植。
Vagrantfile使用的是Ruby语言,但是修改Vagrantfile并不需要了解Ruby语言,因为它更多的是简单的变量赋值。
查找路径
当运行任意vagrant
命令时,Vagrant会首先从当前目录开始,并逐级目录查找所能找到的第一个Vagrantfile。因此,如果在/home/mitchellh/projects/foo
目录下运行vagrant
命令,他会搜索所有的路径,直到找到第一个Vagrantfile为止。
/home/mitchellh/projects/foo/Vagrantfile
/home/mitchellh/projects/Vagrantfile
/home/mitchellh/Vagrantfile
/home/Vagrantfile
/Vagrantfile
这样就可以从项目中的任何目录运行vagrant。
您可以通过将VAGRANT_CWD
环境变量设置为其他路径来更改Vagrant查找Vagrantfile的起始目录。
加载顺序和合并
要理解的一个重要概念是Vagrant如何加载Vagrant文件。Vagrant实际上会加载一系列Vagrant文件,并在运行过程中合并设置。这允许不同级别特殊性的Vagrantfiles覆盖先前的设置。
Vagrantfiles按照如下所示的顺序加载。注意,如果在任何步骤中都没有找到Vagrantfile, Vagrant将继续执行下一步。
- Vagrantfile包装用于指定设备的box容器。
- 在Vagrant根路径下的Vagrantfile文件(默认为
~/.vagrant.d
)。这样可以为系统用户指定一些默认值。 - 项目路径下的Vagrantfile文件。这个Vagrantfile将会是更多时间需要修改的。
- 多设备
- 指定的提供者
在任意层次上,之前的配置都将被相同的配置覆盖。
配置网络
Vagrant为如何将客户机连接到网络提供了多种选择,但是有一个标准的使用模式,以及所有网络配置的一些共同点,这些都很重要,需要了解。
所有网络都在Vagrantfile中使用config.vm.network方法调用进行配置。例如,下面的Vagrantfile定义了一些端口转发:
Vagrant.configure("2") do |config|
# ...
config.vm.network "forwarded_port", guest: 80, host: 8080
end
这里固定虚拟机的IP地址,如下
Vagrant.configure("2") do |config|
config.vm.network "public_network", ip: "192.168.56.10"
end
这里IP的规划要与本机的Virtual虚拟网卡地址在统一网段。
保存Vagrantfile,重启虚拟机(vagrant reload),虚拟机的网络配置就已发生了改变。
多设备运行
Vagrant支持在Vagrantfile
中定义多个设备,在以下场景中可以应用到
- 准确地建模多服务器生产拓扑,例如分离web服务器和数据库服务器。
- 建模一个分布式系统,以及它们如何相互作用。
- 测试一个接口,比如服务组件的API。
- 容灾测试:机器宕机、网络分区、网络延迟等特殊情况。
定义多个设备
多个设备都可以在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
end
正如你所见,config.vm.define
重新定义了一个区域作为另一个变量。这个变量,例如web
,与config
变量完全相同,只是在变量中的任意配置都只适用于当前定义的设备。因此,web
中的任意配置只影响web
这台设备。
并且更重要的是,你还可以继续同样地使用config
对象。配置对象会在设备独有的配置之前进行加载和合并。
如果您熟悉编程,这与语言具有不同的变量作用域类似。
在使用这些作用域时,诸如提供程序之类的事情的执行顺序变得很重要。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"
end
在这种情况下,提供程序将输出“A”,然后是“C”,然后是“B”。注意“B”是最后一个。这是因为按照文件的顺序,排序是由外到内的。
控制多设备
一旦在一个Vagrantfile中定义了不止一台机器,各种Vagrantfile命令的用法就会略有变化。这种变化应该主要是直观的。
只对单个机器有意义的命令,比如vagrant ssh
,现在需要控制机器的名称。使用上面的例子,您可以说vagrant ssh web
或vagrant ssh db
。
其他命令,如vagrant up
,默认情况下在每台机器上运行。所以如果运行vagrant, vagrant会同时打开web和DB机器。你也可以选择是具体的,例如vagrant up web
或vagrant up db
。
另外,Vagrant可以指定一个正则表达式来只匹配某些机器。在拥有许多类似机器的某些情况下很有用,例如,如果正在测试分布式服务,可能有一个leader机器以及follower0, follower1, follower2等。如果想要启动所有的备机而不是主机,可以执行vagrant up /follower[0-9]/
命令。如果Vagrant在正斜杠中看到机器名,则假定正在使用正则表达式。
指定主机
Vagrant也可以指定一个主机。当在多设备环境中没有指定设备作为主机时,那么主机将作为默认设备被使用。指定默认主机,只需要在定义时设置为主设备。并且只能指定一台设备作为主机。
config.vm.define "web", primary: true do |web|
# ...
end
设备的自动启动
在默认情况下的多设备环境中,vagrant up
会启动所有的已定义的设备。autostart
设置可以告诉Vagrant哪些设备是不需要自动启动的。例如:
config.vm.define "web"
config.vm.define "db"
config.vm.define "db_follower", autostart: false
当依照该设置运行vagrant up
时,Vagrant会自动启动web和db设备,但并不会自动启动db_follower设备。如果要启动db_follower设备,可以通过执行vagrant up db_follower
命令启动。
参考:https://developer.hashicorp.com/vagrant/docs