Vagrant 简介

Vagrant 是用于在单个工作流程中构建和管理虚拟机环境的工具,它具有高度的自动化和易于使用的工作流程,大大缩短了开发环境的部署时间,提高了效率。

Vagrant 与 Docker 有点类似,Docker 可以使用 Docker images 来运行不同的容器,而 Vagrant 也有与 Docker images 相似的 Vagrant Box,Vagrant Box 也可以理解为是一个镜像。可以使用一个 base box 运行虚拟机,然后在虚拟机中安装某些软件,然后将这个虚拟机导出为新的 Box。为了保证环境的统一性,你可以将此 Box 分发给其他同事使用。

Vargant 的优点

  1. 环境配置统一

    一次配置打包,统一分发给团队成员,避免诸如 编码问题、缺少模块、配置文件不同 带来的问题。

  2. 环境快速搭建与销毁

    通过统一的 Vagrantfile 配置文件,需要时可以快速的搭建,不需要时可以快速销毁,减少搭建环境的时间成本,减少资源的空闲占用提高资源使用率。

  3. 批量部署多种不同的环境

    通过 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
==> box: Loading metadata for box 'ubuntu/trusty64'
box: URL: https://vagrantcloud.com/ubuntu/trusty64
==> box: Adding box 'ubuntu/trusty64' (v20190514.0.0) for provider: virtualbox
box: Downloading: https://vagrantcloud.com/ubuntu/boxes/trusty64/versions/20190514.0.0/providers/virtualbox.box
Download redirected to host: cloud-images.ubuntu.com
Progress: 0% (Rate: 142k/s, Estimated time remaining: 1:41:47)

命令行参数说明:https://www.vagrantup.com/docs/cli/box

Vagrant Box Mirror

vagrant 镜像仓库是在国外,下载速度很慢。国内的一些镜像源平台同步了相应的镜像,比如以下源:

https://mirrors.ustc.edu.cn/centos-cloud/centos/7/vagrant/x86_64/images/
https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cloud-images/bionic/current/

访问以上源地址,选择并复制 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 add ubuntu-1804-base https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cloud-images/bionic/current/bionic-server-cloudimg-amd64-vagrant.box

上面命令执行完成后,运行 vagrant box list 可以看到名为 ubuntu/bionic-base 的 Box 名称。

Vagrantfile 配置

Vagrant 需要一个名为 Vagrantfile 的配置文件来启动虚拟机,Vagrantfile 中定义了虚拟机的所有配置参数,具体的配置参数可以访问 https://www.vagrantup.com/docs/vagrantfile

以下是一个 Vagrantfile 配置示例:

Vagrant.configure("2") do |config|

config.vm.box_check_update = false
config.vm.graceful_halt_timeout = 60
config.ssh.forward_agent = true

# centos 7.8
config.vm.define "test-centos7-8" do |node|
node.vm.box = "centos7-8-base"
node.vm.synced_folder ".", "/vagrant", type: "virtualbox"
node.ssh.username = 'root'
node.vm.provider "virtualbox" do |v|
v.gui = false
v.memory = 1024
v.cpus = 2
v.name = "test-centos7-8"
end
#私有网
node.vm.network "private_network", hostname: true
#安装 ansible 的脚本,放在 vagrantfile 同目录下
node.vm.hostname = "test-centos7-8"
end

# ubuntu 18.04
config.vm.define "test-ubuntu18-04" do |node|
node.vm.box = "ubuntu-1804-base"
node.vm.provider "virtualbox" do |node|
node.memory = 4096
node.cpus = 2
node.name = "test-ubuntu18-04"
end
node.vm.network "private_network", hostname: true
node.vm.hostname = "test-ubuntu18-04"
end

end

Vagrant 运行虚拟机

Vagrantfile 配置文件准备好之后,在 shell 终端中切换到 Vagrantfile 所在的目录,执行 vagrant up 即可创建虚拟机。

vagrant ssh 延迟处理

时常我们需要通过 vagrant ssh 访问虚拟机终端,但是目前执行 vagrant ssh 登录虚拟机终端会有 2 到 3 秒的延迟,但是直接通过 ssh 登录虚拟机却没有延迟。

目前这个问题 vagrant 官方并没有优化方案,为了避免这个几秒延迟,我绕过 vagrant ssh 去登录虚拟机终端,通过 ssh 别名的方式登录。 如果你与我一样无法忍受这几秒的延迟,可以参考一下我以下的方法。

  1. 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

  2. 把上一步的配置文件保存到 ~/.ssh/config 中。

  3. ~/.bashrc 中添加以下命令,如果没有则手动创建。

    alias vagrantssh='ssh'

    这样配置之后,执行 vagrantssh test-ubuntu18-04 即可快速登录虚拟机终端。但是如果虚拟机比较多则可能无法记住全部的主机名,那接下来需要为 vagrantssh 添加自动补全的功能,通过 TAB 自动补全虚拟机名称。

  4. 创建 ~/vagrant-bash-completion-ext.sh 文件,并保存以下命令到 ~/vagrant-bash-completion-ext.sh 文件。

    注意: 脚本第二行 export pwd 之后需要修改为 Vagrantfile 文件所在目录的绝对路径,本示例是把 Vagrantfile 保存在 ~/vagrant 目录中。

    #!/bin/bash
    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
    }
  5. 再在 ~/.bashrc 文件中添加以下命令,注意命令中有个点。

    complete -F _hostlist vagrantssh
    . ~/vagrant-bash-completion-ext.sh
  6. 以上配置完成后,退出 ssh 终端然后重启打开终端,执行 vagrantssh 即可自动补全 虚拟机名称。