美文网首页思科DevNetvagrant软件
Vagrant--快速搭建实验环境利器

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

作者: 于龙君 | 来源:发表于2017-08-17 23:28 被阅读518次

    本人博客原文:
    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。)

    相关文章

      网友评论

      本文标题:Vagrant--快速搭建实验环境利器

      本文链接:https://www.haomeiwen.com/subject/uchorxtx.html