Contents
5. Vagrant虚拟机快速创建开发环境¶
Vagrant在DevOps环境中的应用
Vagrant是为了方便地实现虚拟化环境而设计的,使用Ruby开发,基于VirtualBox等虚拟机管理软件的接口,提供了一个可配置、轻量级的便携式虚拟开发环境。
我们可以利用Vagrant虚拟开发环境,这样的特别适合团队在开发环境和测试环境中自由切换,这样就可以使得整个团队保持一致的环境,从而方便团队协同进行开发工作。
此外,Vagrant除了虚拟开发环境之外,还可以模拟多台虚拟机,这样我们平时还可以在自己的个人机器(很多读者朋友最常用的就是自己的笔记本)上模拟分布式环境来测试Ansible或Saltstack等自动化配置工具。
5.1. 1. Install VirtualBox¶
系统OS: Windows10
VirtualBox安装: 官方下载地址:https://www.virtualbox.org/wiki/Downloads/
提供安装包版本:VirtualBox-6.1.16-140961-Win.exe
其安装过程很简单,逐步选择“下一步”就可以完成安装了。
5.2. 2. Install Vagrant¶
Vagrant软件的安装地址:https://www.vagrantup.com/downloads
提供安装包版本: vagrant_2.2.15_x86_64.msi
逐步执行就可以完成安装了。
检测安装是否成功,可以打开命令终端,输入vagrant,看看程序的执行状态
命令显示结果如下
C:\Users\18793> vagrant
Usage: vagrant [options] <command> [<args>]
-h, --help Print this help.
Common commands:
autocomplete manages autocomplete installation on host
box manages boxes: installation, removal, etc.
cloud manages everything related to Vagrant Cloud
destroy stops and deletes all traces of the vagrant machine
global-status outputs status Vagrant environments for this user
halt stops the vagrant machine
help shows the help for a subcommand
init initializes a new Vagrant environment by creating a Vagrantfile
login
package packages a running vagrant environment into a box
plugin manages plugins: install, uninstall, update, etc.
port displays information about guest port mappings
powershell connects to machine via powershell remoting
provision provisions the vagrant machine
push deploys code in this environment to a configured destination
rdp connects to machine via RDP
reload restarts vagrant machine, loads new Vagrantfile configuration
resume resume a suspended vagrant machine
snapshot manages snapshots: saving, restoring, etc.
ssh connects to machine via SSH
ssh-config outputs OpenSSH valid configuration to connect to the machine
status outputs status of the vagrant machine
suspend suspends the machine
up starts and provisions the vagrant environment
upload upload to machine via communicator
validate validates the Vagrantfile
version prints current and latest Vagrant version
winrm executes commands on a machine via WinRM
winrm-config outputs WinRM configuration to connect to the machine
C:\Users\18793> vagrant -v
Vagrant 2.2.15
5.3. 3. vagrant Config¶
vagrant官网下载各种最新.box资源:https://app.vagrantup.com/boxes/search
这边下载:geerlingguy/centos7
1)下载及添加Box镜像
vagrant box add base vagrant-cenots-7.6.mini.box
2)我们执行以下命令来建立Box镜像关联
vagrant box add centos7mini vagrant-cenots-7.6.mini.box
3)初始化的命令
vagrant init centos7mini
这样就会在当前目录下生成一个Vagrantfile的文件,里面包含很多配置信息
4)启动虚拟机的命令如下:
D:\work\deploy>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centos7mini'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: deploy_default_1618985040385_958
Vagrant is currently configured to create VirtualBox synced folders with
the `SharedFoldersEnableSymlinksCreate` option enabled. If the Vagrant
guest is not trusted, you may want to disable this option. For more
information on this option, please refer to the VirtualBox manual:
https://www.virtualbox.org/manual/ch04.html#sharedfolders
This option can be disabled globally with an environment variable:
VAGRANT_DISABLE_VBOXSYMLINKCREATE=1
or on a per folder basis within the Vagrantfile:
config.vm.synced_folder '/host/path', '/guest/path', SharedFoldersEnableSymlinksCreate: false
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
==> default: Forwarding ports...
default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
default: SSH address: 127.0.0.1:2222
default: SSH username: vagrant
default: SSH auth method: private key
default: Warning: Connection aborted. Retrying...
default:
default: Vagrant insecure key detected. Vagrant will automatically replace
default: this with a newly generated keypair for better security.
default:
default: Inserting generated public key within guest...
default: Removing insecure key from the guest if it's present...
default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
default: /vagrant => D:/work/deploy
然后,我们通过vagrant ssh命令来查看刚刚新建的虚拟机的SSH配置信息,命令输出结果如下所示:
D:\work\deploy>vagrant ssh
Last login: Wed Apr 21 06:05:16 2021 from 10.0.2.2
[vagrant@localhost ~]$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:b8:1a:94 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic enp0s3
valid_lft 86310sec preferred_lft 86310sec
inet6 fe80::a00:27ff:feb8:1a94/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[vagrant@localhost ~]$ sudo su
[root@localhost vagrant]#
[root@localhost vagrant]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 80G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 79G 0 part
├─centos-root 253:0 0 50G 0 lvm /
├─centos-swap 253:1 0 1G 0 lvm [SWAP]
└─centos-home 253:2 0 28G 0 lvm /home
[root@localhost vagrant]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
5.3.1. 3.1 配置文件详解¶
HOSTNAME设置HOSTNAME的设置非常简单,在Vagrantfile中加入下面这行就可以了:
config.vm.hostname = "deploy_ruby"
2.内存设置内存设置的具体方法如下:
config.vm.provider "virtualbox" do |vb|
# # Display the VirtualBox GUI when booting the machine
# vb.gui = true # 开启图形界面
#
# # Customize the amount of memory on the VM:
vb.memory = "2048"
end
3.网络配置Vagrant中一共提供了三种网络配置。这几种配置可以在Vagrant的配置文件中看到。
(1)端口映射(Forwarded port)端口映射的网络配置方式,就是将本机和虚拟机的端口进行映射。比如,笔者配置本计算机的8088端口为虚拟机的80端口,这样当笔者访问该机器的8088端口时,Vagrant会把请求转发到虚拟机的80端口上去处理。端口映射命令如下:
config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
通过这种方式,我们可以有针对性地把虚拟机的某些端口公布到外网让其他人去访问。
(2)私有网络(Private network)既然是私有的,那么这种方式只允许主机访问虚拟机。这种方式就好像是搭建了一个私有的Linux集群。而且只有一个出口,那就是该主机。
config.vm.network "private_network", ip: "192.168.33.10"
(3)公有网络(Public network)虚拟机享受与实体机器一样的待遇,一样的网络配置,即bridge模式。设定语法如下:
config.vm.network "public_network"
这种网络配置方式比较便于进行团队开发,别人也可以访问你的虚拟机。当然,你和你的虚拟机必须在同一个网段之中。
DHCP自动获取
Vagrant.configure("2") do |config|
config.vm.network "public_network"
end
静态地址
config.vm.network "public_network", ip: "192.168.0.17"
如果更新配置以后,要想使得更新以后的配置生效,可以用命令vagrant reload重启虚拟机。
vagrant reload
5.3.2. 3.2 常用命令详解¶
# 显示当前已经添加的box列表
vagrant box list
#删除相应的box列表
vagrant box remove
#停止当前正在运行的虚拟机并销毁所有创建的资源
vagrant destroy
#与操作真实机器一样,关闭虚拟机器
vagrant halt
#打包命令,将当前运行的虚拟机环境打包
vagrant package
#重新启动虚拟机,主要用于重新载入配置文件
vagrant reload
#输出用于SSH连接的一些信息:
vagrant ssh-config
#挂起当前的虚拟机
vagrant suspend
#恢复前面被挂起的状态
vagrant resume
#获取当前虚拟机的状态
vagrant status
# 可查看全局所有虚拟机的状态
vagrant global-status
# 重启2f5fb92这台虚拟机,使用完整的ID
vagrant reload 2f5fb92
# 将2f5fb92这台虚拟机关机,使用缩写的ID
vagrant halt 2f5
# 使用name,以及省略目标参数
# 都只能操作当前.vagrant所在目录下的虚拟机
vagrant ssh default
vagrant ssh # ssh进入当前目录下.vagrant内的虚拟机
# 切换其他目录后,id可全局使用,name不可使用
cd ..
vagrant up 2f5
vagrant up default
这里只是简单概括常用子命令的功能而不介绍如何使用,后面涉及到的时候自然就会用了。
子命令 |
功能说明 |
|---|---|
box |
管理box镜像(box是创建虚拟机的模板) |
init |
初始化项目目录,将在当前目录下生成Vagrantfile文件 |
up |
启动虚拟机 |
reload |
重启虚拟机 |
halt |
将虚拟机关机 |
destroy |
删除虚拟机(包括虚拟机文件) |
suspend |
暂停(休眠、挂起)虚拟机 |
resume |
恢复已暂停(休眠、挂起)的虚拟机 |
snapshot |
管理虚拟机快照(hyperv中叫检查点) |
status |
列出当前目录 |
global-status |
列出全局已安装虚拟机列表及它们的状态 |
ssh |
通过ssh连接虚拟机 |
ssh-config |
输出ssh连接虚拟机时使用的配置项 |
port |
查看各虚拟机映射的端口列表(hyperv不支持该功能) |
D:\work\deploy>vagrant ssh-config
Host server
HostName 127.0.0.1
User vagrant
Port 2222
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile D:/work/deploy/.vagrant/machines/server/virtualbox/private_key
IdentitiesOnly yes
LogLevel FATAL
Host server2
HostName 127.0.0.1
User vagrant
Port 2200
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile D:/work/deploy/.vagrant/machines/server2/virtualbox/private_key
IdentitiesOnly yes
LogLevel FATAL
# 连接方式
D:\work\deploy>ssh vagrant@127.0.0.1 -p 2222 -i D:/work/deploy/.vagrant/machines/server/virtualbox/private_key
D:\work\deploy>ssh vagrant@127.0.0.1 -p 2200 -i D:/work/deploy/.vagrant/machines/server2/virtualbox/private_key
[vagrant@server2 ~]$
Vagrantfile文件示例
Vagrant.configure("2") do |config|
config.vm.define "server1" do |vb|
config.vm.provider "virtualbox" do |v|
v.memory = 2048
v.cpus = 2
end
vb.vm.host_name = "server1"
config.vm.network "private_network", ip: "192.168.1.100"
vb.vm.box = "centos7mini"
end
# config.vm.define "server2" do |vb|
# config.vm.provider "virtualbox" do |v|
# v.memory = 2048
# v.cpus = 2
# end
# vb.vm.host_name = "server2"
# config.vm.network "private_network", ip: "192.168.1.101"
# vb.vm.box = "centos7mini"
# end
end
5.4. 4. vagrant创建一个CentOS7¶
cd centos7-vm1
vagrant init
Vagrantfile内容如下:
# -*- mode: ruby -*-
# vi: set ft=ruby :
# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
config.vm.define "server1" do |vb|
config.vm.provider "virtualbox" do |v|
v.memory = 1024
v.cpus = 1
end
vb.vm.host_name = "server1"
vb.ssh.password = "vagrant"
vb.ssh.insert_key = false
config.vm.network "private_network", ip: "192.168.100.100"
config.vm.box = "centos7"
config.vm.box_url = "http://mirrors.ustc.edu.cn/centos-cloud/centos/7/vagrant/x86_64/images/CentOS-7-x86_64-Vagrant-2002_01.VirtualBox.box"
end
end
然后执行:
$ vagrant up
$ vagrant ssh-config
Host server1
HostName 127.0.0.1
User vagrant
Port 2222
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentitiesOnly yes
LogLevel FATAL
# 删除根据当前目录下的Vagrantfile所安装的虚拟机
$ vagrant destroy --force
5.5. 5. vagrant启动一个Ubuntu¶
mkdir test4
cd test4
vagrant init ubuntu1804 http://mirrors.ustc.edu.cn/ubuntu-cloud-images/bionic/20201007/bionic-server-cloudimg-amd64-vagrant.box
vagrant up
vagrant ssh
比较常见的centos box镜像和ubuntu box镜像,可以在它们的cloud站点找到,例如它们自己的官方站点、中科大镜像源站点:
CentOS7:
# CentOS cloud官方镜像站点
https://cloud.centos.org/centos/7/vagrant/x86_64/images/
# CentOS Cloud中科大镜像站点
http://mirrors.ustc.edu.cn/centos-cloud/centos/7/vagrant/x86_64/images/
Ubuntu(以focal即20.04为例),找到其中的xxx-yyy-vagrant.box文件:
# Ubuntu cloud官方镜像站点
https://cloud-images.ubuntu.com/focal/20201012/
# Ubuntu Cloud中科大镜像站点
http://mirrors.ustc.edu.cn/ubuntu-cloud-images/focal/20201007/
5.6. 6. vm进行封装¶
每一个box都是由他人打包好的虚拟机,只不过它是特殊格式的文件,且后缀名一般为.box。我们也可以使用vagrant package打包自己的虚拟机并分发给别人使用。
(1)升级Python版本,安装IPython
(2)安装ruby、gcc、cmake、git
(3)安装Go
等基础,安装完毕之后,进行打包封装
vagrant package
vagrant package -hUsage: vagrant package [options] [name]Options:
--base NAME virtualbox程序里面的虚拟机的名称,不是box的名字也不是Vagrantfile里面的虚拟机名称.默认是打包当前目录下面的虚拟机。
--output NAME 要打包成的box名称,不会自动添加.box后缀,要手动加.默认值package.box --include FILE... 打包时包含的文件名,你可以把.box文件理解为一个压缩包
--vagrantfile FILE 打包时包含的Vagrantfile文件,原理和上面类似
-h, --help Print this help
查看虚拟机主机名
C:\Program Files\Oracle\VirtualBox>vboxmanage list vms
"deploy_server1_1618996977653_7473" {c49f3534-4dd5-4d54-a974-d3cb1c312eae}
结果如下所示:
vagrant package --base deploy_server1_1618996977653_7473 --output D:\work\deploy\CentOS7mini_ruby.box
至此,我们可以将这个CentOS7mini_ruby.box放进优盘,供自己的工作机器使用,或者放进公司内部的FTP服务器里,供DevOps团队的其他同事们使用。
5.7. 7. 使用vm封装后的虚拟机¶
到上面第二步的时候已经打包完毕了,如果想在其他电脑部署自己的box很简单 先把box文件和Vagrantfile文件放到需要部署的磁盘目录下。
执行以下操作命令: 1、将box安装到vagrant容器
$ vagrant box add test CentOS7mini_ruby.box
#vagrant box add [虚拟机名称] [box放置的位置]
2、修改vagrantfile中的vm.box名称为虚拟机名称
vb.vm.box = "test"
然后直接启动即可
$ vagrant up
5.8. 8.使用vagrant创建多台虚拟机¶
单机上如何通过虚拟机打造分布式集群系统。这种多机器模式特别适用于以下几种场景。
❑ 快速建立产品网络的多机器环境集群,例如Web服务器集群、DB服务器集群等。
❑ 建立一个分布式系统,学习它们是如何进行交互的。
❑ 测试API与其他组件的通信。
❑ 容灾模拟,测试网络断网、机器死机、连接超时等情况。
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
(1..5).each do |i|
config.vm.define "node#{i}" do |node|
node.vm.box = "../iso/CentOS-7-x86_64-Vagrant-1811_02.VirtualBox.box"
#node.vm.box = "Centos/7"
node.vm.hostname = "node#{i}"
node.vm.network "public_network"
node.vm.provider "virtualbox" do |v|
v.name = "node#{i}"
v.memory = 1024
v.cpus = 2
end
end
end
end
利用vagrant启动各VM的命令如下:
vagrant up
参考文献: