vagrant 快速搭建开发测试环境
Vagrant 简介
Vagrant 是用于在单个工作流程中构建和管理虚拟机环境的工具,它具有高度的自动化和易于使用的工作流程,大大缩短了开发环境的部署时间,提高了效率。
Vagrant 与 Docker 有点类似,Docker 可以使用 Docker images 来运行不同的容器,而 Vagrant 也有与 Docker images 相似的 Vagrant Box,Vagrant Box 也可以理解为是一个镜像。可以使用一个 base box 运行虚拟机,然后在虚拟机中安装某些软件,然后将这个虚拟机导出为新的 Box。为了保证环境的统一性,你可以将此 Box 分发给其他同事使用。
Vargant 的优点
环境配置统一
一次配置打包,统一分发给团队成员,避免诸如 编码问题、缺少模块、配置文件不同 带来的问题。
环境快速搭建与销毁
通过统一的
Vagrantfile配置文件,需要时可以快速的搭建,不需要时可以快速销毁,减少搭建环境的时间成本,减少资源的空闲占用提高资源使用率。批量部署多种不同的环境
通过
Vagrantfile配置文件可以定义不通的环境,然后一次性快速搭建。
Vagrant 安装
Vagrant 支持多种平台,比如有 Windows 版、MacOS 版,也有 linux 版本,访问 http://downloads.vagrantup.com 根据使用平台进行下载并安装。
VirtualBox 安装
Vagrant 它只是一个虚拟机的管理工具,它本身并不支持虚拟化功能。Vagrant 需要一个外部的虚拟化管理工具来实现虚拟机的创建,并通过虚拟化管理工具的 API 来实现虚拟机的管理。开源社区中目前用的最多的应该是 VirtualBox ,它也支持 VMware ,不过目前 VMware 是收费的。
VirtualBox 下载请访问 https://www.virtualbox.org/wiki/Downloads 。
Vagrant Box
上面两个步骤完成后 Vagrant 环境就安装完成了,接下来需要下载 Box 镜像来启动虚拟机。Vagrant 提供了与 Dockerhub 类似的镜像仓库 https://app.vagrantup.com/boxes/search ,里面托管了大量 linux 官方或者三方的 Box 镜像。
以 ubuntu/trusty64 为例:
执行 vagrant box add ubuntu/trusty64 将会自动从 vagrant 镜像仓库拉取镜像,默认是 latest 版本,如果想添加指定版本的镜像,可以使用 –box-version 参数。
hxl@rancher:~/vagrant$ vagrant box add ubuntu/trusty64 |
Vagrant Box Mirror
vagrant 镜像仓库是在国外,下载速度很慢。国内的一些镜像源平台同步了相应的镜像,比如以下源:
https://mirrors.ustc.edu.cn/centos-cloud/centos/7/vagrant/x86_64/images/ |
访问以上源地址,选择并复制 Box 具体地址。
https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cloud-images/bionic/current/bionic-server-cloudimg-amd64-vagrant.box |
执行以下命令把 Box 下载到本地,title 可以任意设置,代表这个 Box 在本地的名称,url 为在线 Box 的地址。
vagrant box add {title} {url} |
上面命令执行完成后,运行 vagrant box list 可以看到名为 ubuntu/bionic-base 的 Box 名称。
Vagrantfile 配置
Vagrant 需要一个名为 Vagrantfile 的配置文件来启动虚拟机,Vagrantfile 中定义了虚拟机的所有配置参数,具体的配置参数可以访问 https://www.vagrantup.com/docs/vagrantfile 。
以下是一个 Vagrantfile 配置示例:
Vagrant.configure("2") do |config| |
Vagrant 运行虚拟机
在 Vagrantfile 配置文件准备好之后,在 shell 终端中切换到 Vagrantfile 所在的目录,执行 vagrant up 即可创建虚拟机。
vagrant ssh 延迟处理
时常我们需要通过 vagrant ssh 访问虚拟机终端,但是目前执行 vagrant ssh 登录虚拟机终端会有 2 到 3 秒的延迟,但是直接通过 ssh 登录虚拟机却没有延迟。
目前这个问题 vagrant 官方并没有优化方案,为了避免这个几秒延迟,我绕过 vagrant ssh 去登录虚拟机终端,通过 ssh 别名的方式登录。 如果你与我一样无法忍受这几秒的延迟,可以参考一下我以下的方法。
在
Vagrantfile所在的目录,执行vagrant ssh-config打印每个虚拟机的 ssh 配置文件,执行命令需要先运行虚拟机。命令运行后应该会获取到类似以下的配置文件:hxl@rancher:~/vagrant$ vagrant ssh-config
Host test-centos7-8
HostName 127.0.0.1
User root
Port 2222
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /Users/hxl/.vagrant.d/insecure_private_key
IdentitiesOnly yes
LogLevel FATAL
ForwardAgent yes
Host test-ubuntu18-04
HostName 127.0.0.1
User root
Port 2200
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /Users/hxl/.vagrant.d/insecure_private_key
IdentitiesOnly yes
LogLevel FATAL
ForwardAgent yes把上一步的配置文件保存到
~/.ssh/config中。在
~/.bashrc中添加以下命令,如果没有则手动创建。alias vagrantssh='ssh'
这样配置之后,执行
vagrantssh test-ubuntu18-04即可快速登录虚拟机终端。但是如果虚拟机比较多则可能无法记住全部的主机名,那接下来需要为 vagrantssh 添加自动补全的功能,通过 TAB 自动补全虚拟机名称。创建
~/vagrant-bash-completion-ext.sh文件,并保存以下命令到~/vagrant-bash-completion-ext.sh文件。注意: 脚本第二行 export pwd 之后需要修改为
Vagrantfile文件所在目录的绝对路径,本示例是把Vagrantfile保存在 ~/vagrant 目录中。
export pwd=$( echo ~/vagrant )
__pwdln() {
pwdmod="${pwd}/"
itr=0
until [[ -z "$pwdmod" ]];do
itr=$(($itr+1))
pwdmod="${pwdmod#*/}"
done
echo -n $(($itr-1))
}
__vagrantinvestigate() {
if [ -f "${pwd}/.vagrant" -o -d "${pwd}/.vagrant" ];then
echo "${pwd}/.vagrant"
return 0
else
pwdmod2="${pwd}"
for (( i=2; i<=$(__pwdln); i++ ));do
pwdmod2="${pwdmod2%/*}"
if [ -f "${pwdmod2}/.vagrant" -o -d "${pwdmod2}/.vagrant" ];then
echo "${pwdmod2}/.vagrant"
return 0
fi
done
fi
return 1
}
_hostlist() {
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
vagrant_state_file=$(__vagrantinvestigate) || return 1
local vm_list=$(find "${vagrant_state_file}/machines" -mindepth 1 -maxdepth 1 -type d -exec basename {} \;)
COMPREPLY=($(compgen -W "${vm_list}" -- ${cur}))
return 0
}再在
~/.bashrc文件中添加以下命令,注意命令中有个点。complete -F _hostlist vagrantssh
. ~/vagrant-bash-completion-ext.sh以上配置完成后,退出 ssh 终端然后重启打开终端,执行 vagrantssh 即可自动补全 虚拟机名称。

