本人博客原文:
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. 在线下载安装
-
vagrant box add username/boxname
添加vagrant云仓库里别人做好的box模板。https://app.vagrantup.com/boxes/search在这里可以搜索到,还可以看到详情信息。
例如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 update
update to the latest version. -
CentOS-Base.repo
andepel.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.repo
和epel.repo
更换为 阿里云的 repo (国内更快) -
加了一些有用的工具:
vim
、tree
、wget
、bash-completion
、net-tools
、tcpdump
、ab
。 -
禁用了SElinux。
-
在box里添加了VirtualBox的虚机客户端。(需要在宿主机上安装插件vagrant-vbguest:
vagrant plugin install vagrant-vbguest
。)
介绍:
** In English**:
Base on CentOS official box centos/7. the following changes have been made:
-
yum update
update to the latest version. -
CentOS-Base.repo
andepel.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.repo
和epel.repo
更换为 阿里云的 repo (国内更快) -
加了一些有用的工具:
vim
、tree
、wget
、bash-completion
、net-tools
、tcpdump
、ab
。 -
禁用了SElinux。
-
在box里添加了VirtualBox的虚机客户端。(需要在宿主机上安装插件vagrant-vbguest:
vagrant plugin install vagrant-vbguest
。)
网友评论