Vagrant--快速搭建实验环境利器

0.376字数 2976阅读 3278

本人博客原文:
http://www.yulongjun.com/cloud/20170813-vagrant/
http://www.yulongjun.com/cloud/20170829-vagrant-custom-box/

Vagrant是一个虚拟机管理软件,需要结合虚拟机软件来使用。使用Vagrant能迅速创建批量虚拟机环境。对于做实验的同学来说,可以说是利器。

官网地址:www.vagrantup.com

一、下载与安装

  • Vagrant不能单独使用,需要依赖虚拟机软件如Virtualbox和Vmware,这里推荐Virtualbox,Vmware是需要收费的才能使用(序列号破解的不能用的)。
  • box镜像是网上别人做好的模板,CentOS官方、Ubuntu官方、Debian官方都有专门去制作做好了的模板(而且一直更新迭代),直接安装就可以用(可以使用命令安装,也可以离线下载安装。)

VirtualBox下载地址:https://www.virtualbox.org/wiki/Downloads

Vagrant支持四大主流操作系统,可以根据自己的操作系统进行下载安装,安装过程不赘述。

Vagrant下载地址:https://www.vagrantup.com/downloads.html

Vagrant Boxes镜像名称和介绍:https://app.vagrantup.com/boxes/search


二、基础命令

查看vagrant帮助命令:

vagrant --help

比较常用的一些命令:

#  模板(box)相关命令
vagrant box list  # 列出虚机模板
vagrant box add USERNAME/BOX_NAME  # 添加别人做好的虚机,在线下载。
vagrant box add PATH/TO/BOX  # 添加本地离线下载好的box
vagrant box remove  # 移除虚机

# 虚机(vm)相关命令
vagrant init  BOX  # 初始化一个Vagrantfile文件。BOX为虚机模板名
vagrant status  [VM_NAME]  # 虚拟机状态。不跟参数默认查看所有虚机,指定虚机名字(VM_NAME)查看指定的虚机状态
vagrant destroy [VM_NAME]  # 删除虚机。不跟参数默认删除所有,指定虚机名字(VM_NAME)删除指定的虚机
vagrant up [VM_NAME]  # 启动虚机。不跟参数默认启动所有,指定虚机名字(VM_NAME)启动指定的虚机
vagrant down [VM_NAME]  # 关闭虚机。不跟参数默认关闭所有,指定虚机名字(VM_NAME)关闭指定的虚机
vagrant suspend [VM_NAME]  # 挂起虚机。不跟参数默认关闭所有,指定虚机名字(VM_NAME)挂起指定的虚机
vagrant resume [VM_NAME]  # 从挂起状态恢复运行。不跟参数默认恢复所有,指定虚机名字(VM_NAME)恢复指定的虚机
vagrant reload [VM_NAME]  # 从挂起状态恢复运行。不跟参数默认恢复所有,指定虚机名字(VM_NAME)恢复指定的虚机

下面详细讲解box的命令使用,还有虚机相关命令的使用。


三、下载安装box模板

安装box模板有两种途径。一种是在线下载安装;一种是离线下载,然后添加进去。

1. 在线下载安装

例如CentOS官方的两个:

vagrant box add centos/7
vagrant box add centos/6

vagrant box remove xxx/yyy可以移除你安装的box模板。

在线下载安装的时候,会让你选择下哪种虚拟机软件的box模板,我们选择virtualbox版本的。

用vagrant命令在线下载完成后,会有一行绿色的Sucessfully显示成功:

2. 离线下载安装

因为主机在国外,有时候网络环境不是,下载慢。那么就可以复制上上个图那里圈起来的链接。复制链接到浏览器下载。(其实我发现,那个地址有的是地址转换,如下图,我们可以看到是从cloud.centos.org下载的,文件名都变成CentOS-x-Vagrant-xxxx.Virtualbox.box这种长格式。而且地址是centos.org的地址说明这个景象是CentOS官方提供的):

这里贴出目前最新的,你可以自己去用上述方法找到最新的:

CentOS 7 :1707_01
CentOS 6 :1707_01

我在百度云也存了一份(不更新,如果你看这篇文章的时候在之后的很长时间的话,还是用上述方法离线自行下载最新版):

链接: https://pan.baidu.com/s/1i5oqW5n
密码: 7grf

离线下载完成后,就可以用命令添加下载好的box模板,例如:

vagrant box add ~/Downloads/CentOS-6-x86_64-Vagrant-1707_01.VirtualBox.box --name centos/6

--name 参数,是指定本地离线添加的文件导入vagrant程序后的名字。

3. 关于版本

列出添加的box模板:

vagrant box list

我们可以看到括号里有版本号。

在线下载安装的,括号里会跟其他人制作时所定义版本号。
离线下载然后本地添加的,括号里默认版本号是0。

4. 常用的几个模板

几个常用的官方在线box模板:

  • centos/7 CentOS 7 x64
  • centos/6 CentOS 6 x64
  • ubuntu/xenial64 Ubuntu 16.04 LTS x64
  • ubuntu/trusty64 Ubuntu 14.04 LTS x64

四、安装和使用单台虚机

我们先以一台为例,介绍常用的几个命令的使用方法。

1. 用指定模板来初始化配置文件Vagrantfile(init)

mkdir test  # 创建一个test项目目录
cd test  # 进入test目录
vagrant init centos/7 # 用centos/7这个box模板进行初始化

我们可以看到在项目目录test下面,创建了一个VagrantFile的文件,这个就是虚拟机的配置文件。后续配置复杂多台虚机的时候我们会讲到这个文件的使用。我们先用默认的配置启动虚拟机,默认配置只启动一台。通通过一台的命令,我们来熟悉一些命令的使用。

2. 启动(up)、关闭(halt)、暂停(suspend)、恢复(resume)、重载(reload)虚机

vagrant up

第一次启动会从模板复制一份虚机到当前目录,然后进行一系列配置工作。

vagrant status 可以查看虚拟机状态:

我们可以看到下面有一行提示几个命令的作用:

  • vagrant halt 关闭(halt)虚机
  • vagrant up 启动(up)虚机
  • vagrant suspend 暂停(suspend)虚机

还有两条用的也很多:

  • vagrant resume 从暂停中恢复(resume)虚机
  • vagrant reload 重载(reload)虚拟机,也就是重启虚拟机(在Vmware类的软件里也叫做重置,都是一个意思)。如果修改了配置文件,reload会按照配置文件来更改虚拟机的一些配置。

3. 登录虚机

vagrant ssh可以登录虚拟机,是以vagrant用户登录的,我们可以看vagrant init那张图,可以看到有生成秘钥对并上传公钥到虚拟机了,所以vagrant ssh可以无秘钥登录。

4. 销毁(destory)虚机

vagrant destory

tips: 上述的命令都是基于一台虚拟机的操作,所以相对比较简单,多台是在上述命令基础上加一些参数而已。


五、制作自己习惯用的模板

通常我们会自定义一个虚机,配置成自己习惯用的状态,然后打包,打包命令是:

vagrant package 

下面通过一个例子来说明如何打包:(下文中直接用了官方镜像,然后安装了一些自己需要的包,关闭了selinux策略。记得要删除网卡的信息。)

vagrant ssh #
sudo su -
setenforce 0 # 关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 永久禁止selinux
yum install vim tree bash-completion # 安装一些需要的包。
rm -rf /etc/udev/rules.d/70-persistent-net.rules  # 删除网卡的信息,否则在其他地方启动会有问题

vagrant package  # 关机并打包虚机,会在项目目录生成一个package.box模板文件
vagrant box add longdream/centos7 package.box  # 打包的虚机模板可以作为模板进行创建虚机。

六、Vagrantfile参数详解

我们可以看到在项目目录下面有一个Vagrantfile文件,这个就是这个项目的配置文件,通过修改这个配置文件,我们可以来批量创建多个虚机并且有不同的配置,只要写好配置就可以实现。

config.xx.yyy指的是项目全局配置。
NODE_NAME.xx.yyy指的是单独的节点的配置,需要比全局配置缩进一层。

下面来详解里面的配置选项,然后下一小节我们就实战来通过这个文件来搭一套测试环境。

1. config.vm.define定义多台主机

config.vm.define "node1" do |node1|
end
config.vm.define "node1" do |node2|
end
config.vm.define "node1" do |node3|
end

2. *.vm.network 虚拟机网络

nat默认方式
forwarded_port 端口转发
private network 私有网络(仅主机模式)
public network 公有网络(桥接模式)

Vagrantfile自带的几个示例:

config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.network "public_network"
  • 默认所有主机都会创建一个NAT网络作为eth0的网络,ip地址是自动分配的。
  • 写了ip就是静态ip地址,没写ip就会dhcp自动分配一个地址。
  • 如果写了多条网络配置,那么就是配置多个网络,服务器会自动多几个网卡。当然,默认的NAT网络的eth0还在(作为vagrant ssh命令登录使用的网络,还有yum更新的网络),自己写的配置文件,从上到下依次匹配eth1,eth2等。

例子:

config.vm.define "node1" do |node1|
    node1.vm.network "private_network", ip: "192.168.33.11"
    node1.vm.network "public_network"
  end

  config.vm.define "node2" do |node2|
    node2.vm.network "private_network", ip: "192.168.33.12"
  end

  config.vm.define "node3" do |node3|
    node3.vm.network "private_network", ip: "192.168.33.13"
  end

3. *.vm.hostname 定义虚机主机名

NODE_NAME.vm.hostname = HOSTNAME定义主机名,NODE_NAME为节点名,HOSTNAME为定义的主机名。

例子:

config.vm.define "node1" do |node1|
    node1.vm.network "private_network", ip: "192.168.33.11"
    node1.vm.network "public_network"
    node1.vm.hostname = "node1.yulongjun.com"
  end

  config.vm.define "node2" do |node2|
    node2.vm.network "private_network", ip: "192.168.33.12"
    node2.vm.hostname = "node2.yulongjun.com"
  end

  config.vm.define "node3" do |node3|
    node3.vm.network "private_network", ip: "192.168.33.13"
    node3.vm.hostname = "node3.yulongjun.com"
  end

4. *.vm.synced_folder 宿主机与虚机共享同步目录

默认宿主机项目目录和虚拟机下的/vagrant目录同步。

如果还想自定义共享目录,可以参照下面用法:

config.vm.synced_folder "宿主机目录", "虚机机目录"
    create: true|false, owner: "用户", group: "用户组"
  • 宿主机目录一般是写的相对路径。相对的路径是相对的项目根目录。例如项目目录为test,那么宿主机目录写"www/"指的就是就是test/www目录。
  • 虚拟目录是虚拟机上目录,一般写绝对路径。
  • create: true|false指的是是否在虚拟机创建此目录。
  • owner: "用户", group: "用户组"指的是指定目录的拥有者和拥有组。
config.vm.synced_folder "www/", "/var/www/",
  create: true, owner: "root", group: "root"

七、插件

插件安装方法:

vagrant plugin install xxxx

1. 插件vagrant-hostmanager:用主机名访问(建议安装)

可以实现虚机之间用主机名互相访问,也可以实现宿主机用主机名访问虚机。

安装:

vagrant plugin install vagrant-hostmanager

修改Vagrantfile文件

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

  config.vm.box = "centos/7"
  config.hostmanager.enabled = true       # 启用hostmanager
  config.hostmanager.manage_guest = true  # 允许更新虚拟机上的文件
  config.hostmanager.manage_host = true   # 允许更新主机上的文件

  config.vm.define "node1" do |node1|
    node1.vm.network "private_network", ip: "192.168.33.11"
    node1.vm.network "public_network"
    node1.vm.hostname = "node1.yulongjun.com"
  end

  config.vm.define "node2" do |node2|
    node2.vm.network "private_network", ip: "192.168.33.12"
    node2.vm.hostname = "node2.yulongjun.com"
  end

  config.vm.define "node1=3" do |node3|
    node3.vm.network "private_network", ip: "192.168.33.13"
    node3.vm.hostname = "node3.yulongjun.com"
  end

end

2. 插件vagrant-vbguest:自定义共享目录(建议安装)

有时候我们发现有些virtualbox无法使用自定义的共享目录,这时候就需要安装vbguest客户端(类似于VMware的client)

vagrant vbguest --status
vagrant vbguest --do install node1
vagrant vbguest --do install node2
vagrant vbguest --do install node3
vagrant vbguest --status

每次启动虚机都会检查vbguest插件的更新,如果不想更新,修改Vgrantfilew文件,加上这样一条:

config.vbguest.auto_update = false

3. 插件vagrant-bindfs 支持多种共享模式(可选)

插件bindfs可以支持多种共享模式,如nfs,samba

命令行下输入:

vagrant plugin install vagrant-bindfs

修改Vgrantfile文件:

config.vm.define "node1" do |node1|
  node1.vm.network "private_network", ip: "192.168.33.11"
  node1.vm.hostname="node1.yulongjun.com"
  node1.vm.synced_folder "./app" "/mnt/app-data", type: "nfs"
  node1.bindfs.bind_folder "/mnt/app-data" "/app"
    force_user: "root", force_group: "root", o: "noempty"

八、实验例子

1. 搭建一个每台机器不同配置的实验环境。

用自己做的镜像最好,首先是已经安装了一些常用的包,二是如果是初始镜像,一开始需要安装几个包,比较耽误时间,自己打包的镜像已经安装好了。

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  # Vagrant Global Config
  # `longdream/centos7` is a custom centos7 box made by YuLongjun.
  config.vm.box = "longdream/centos7"
  # If this box is add online, set true will check update.
  # Also set `false` will not update it.
  # If this box is added locally, this setting is invalid.
  config.vm.box_check_update = false
  # you need `vagrant plugin install vagrant-vbguest`
  # You also need `vagrant plugin install vagrant-hostmanager`
  config.hostmanager.enabled = true
  # Allow update `/etc/hosts` file in VMs.
  config.hostmanager.manage_guest = true
  # Allow update `/etc/hosts` file in Hosts.
  config.hostmanager.manage_host = true
  
  # Define VM `client`
  config.vm.define "client" do |client|
    client.vm.network "private_network", ip: "172.16.111.123"
    client.vm.hostname = "client"
  end

  # Define VM `vs`
  config.vm.define "vs" do |vs|
    vs.vm.network "private_network", ip: "172.16.111.200"
    vs.vm.network "private_network", ip: "192.168.111.200"
    vs.vm.hostname = "vs"
  end

  # Define VM `rs1`
  config.vm.define "rs1" do |rs1|
    rs1.vm.network "private_network", ip: "192.168.111.101"
    rs1.vm.hostname = "rs1"
    rs1.vm.provision "shell", inline: " sudo echo 'GATEWAY=192.168.111.200' >> /etc/sysconfig/network-scripts/ifcfg-eth1"
  end

  # Define VM `rs2`
  config.vm.define "rs2" do |rs2|
    rs2.vm.network "private_network", ip: "192.168.111.102"
    rs2.vm.hostname = "rs2"
    rs2.vm.provision "shell", inline: "sudo echo 'GATEWAY=192.168.111.200' >> /etc/sysconfig/network-scripts/ifcfg-eth1"
  end

end

2. 批量搭建一组服务器(20170829补充)

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  # Vagrant Global Config
  # `longdream/centos7` is a custom centos7 box made by YuLongjun.
  config.vm.box = "longdream/centos7"
  # If this box is add online, set true will check update.
  # Also set `false` will not update it.
  # If this box is added locally, this setting is invalid.
  config.vm.box_check_update = false
  # you need `vagrant plugin install vagrant-vbguest`
  # You also need `vagrant plugin install vagrant-hostmanager`
  config.hostmanager.enabled = true
  # Allow update `/etc/hosts` file in VMs.
  config.hostmanager.manage_guest = true
  # Allow update `/etc/hosts` file in Hosts.
  config.hostmanager.manage_host = true

  # define 10 VMs in batch.
  # you can up a VM:`vagrant up node1`
  # you can up all VMs:`vagrant up`
  # you can up some VMs:`vagrant up `node[1-4]`
  (1..9).each do |i|
    config.vm.define "node#{i}" do |node|
      node.vm.network "private_network", ip: "192.168.111.#{i}0"
      node.vm.hostname = "node#{i}"
    end
  end

  # Create a single VM.
  #config.vm.define "client" do |client|
  #  client.vm.network "private_network", ip "192.168.0.123"
  #  client.vm.hostname "client"
  #  client.vm.provision "shell", inline: <<-SHELL
  #    sudo yum install tcpdump ab
  #  SHELL
end


自制的Vagrant镜像(20170830补充)

自己做了一个Vagrant镜像,上传到Vagrant官方的Vagrant Cloud上,方便自己和读者使用。

目前为1.0.0版本。

项目地址:longdream/centos7

Vagrant可以使用下面命令安装:

vagrant box add longdream/centos7

自己做了一个Vagrant镜像,上传到Vagrant官方的Vagrant Cloud上,方便自己和读者使用。

目前为1.0.0版本。

项目地址:longdream/centos7

Vagrant可以使用下面命令安装:

vagrant box add longdream/centos7

关于Vagrant使用,可参考:Vagrant--快速搭建实验环境利器


Introduction

In English:

Base on CentOS official box centos/7. the following changes have been made:

  • yum updateupdate to the latest version.

  • CentOS-Base.repo and epel.repo change to aliyun's repos(which more fast in China).

  • Some useful tools: vim, tree, wget ,bash-completion, net-tools ,tcpdump ,ab.

  • Disabled SELinux.

  • Add VirtualBox Guest in box. (Need plugin vagrant-vbguest in Host:vagrant plugin install vagrant-vbguest.)

中文:

基于CentOS官方box centos/7。做了如下的更改:

  • yum update更新到最新版。

  • CentOS-Base.repoepel.repo 更换为 阿里云的 repo (国内更快)

  • 加了一些有用的工具vimtreewgetbash-completionnet-toolstcpdumpab

  • 禁用了SElinux

  • 在box里添加了VirtualBox的虚机客户端。(需要在宿主机上安装插件vagrant-vbguestvagrant plugin install vagrant-vbguest。)

介绍

** In English**:

Base on CentOS official box centos/7. the following changes have been made:

  • yum updateupdate to the latest version.

  • CentOS-Base.repo and epel.repo change to aliyun's repos(which more fast in China).

  • Some useful tools: vim, tree, wget ,bash-completion, net-tools ,tcpdump ,ab.

  • Disabled SELinux.

  • Add VirtualBox Guest in box. (Need plugin vagrant-vbguest in Host:vagrant plugin install vagrant-vbguest.)

中文

基于CentOS官方box centos/7。做了如下的更改:

  • yum update更新到最新版。

  • CentOS-Base.repoepel.repo 更换为 阿里云的 repo (国内更快)

  • 加了一些有用的工具vimtreewgetbash-completionnet-toolstcpdumpab

  • 禁用了SElinux

  • 在box里添加了VirtualBox的虚机客户端。(需要在宿主机上安装插件vagrant-vbguestvagrant plugin install vagrant-vbguest。)

推荐阅读更多精彩内容