文档编号:[pxxx - ]xxx - 1xx - ymd - xxxx 说明(保持文档结构,内容多则加附件)
规则:([项目代码/编号-]文档类别/简介-组员编号-填写日期-流水号) […]表示可选项

系统环境

安装VirtualBox

  1. 安装过程略,**_注意:在安装__Vagrant__前需要安装__VirtualBox___**<br />安装完虚拟机以后虚拟的磁盘文件默认是放在C盘的,修改方法如下:“管理”-->“全局设定”-->“常规”,然后手动修改“默认虚拟电脑位置”即可,如图:<br />![](https://cdn.nlark.com/yuque/0/2020/png/788484/1594623787891-f1cd31e2-8222-4214-a226-38e4349102b2.png#height=761&id=K4Yhr&originHeight=407&originWidth=558&originalType=binary&ratio=1&status=done&style=none&width=1044)

安装Vagrant

安装过程略,安装完成后需要重启机器完成整个安装过程。重启后可以进行box路径的配置。

设置共享目录

  1. Vagrant需要先安装virtualbox guest addtions才能开启Virtualbox目录共享功能。未开启时启动虚拟机将会抛出异常**___unknown filesystem type vboxsf___**。解决方案如下:
  1. # 示例(Cygwin客户端)
  2. cd /cygdrive/e/vagrant/mybox/bigdata
  3. vagrant up && vagrant ssh
  4. # 使用root用户更新系统组件(配置yum源过程省略)
  5. sudo su
  6. rm -f /var/run/yum.pid # 当出现"Another app is currently holding the yum lock; waiting for it to exit..."时执行
  7. yum update
  8. yum install -y gcc gcc-devel gcc-c++ gcc-c++-devel make kernel kernel-devel
  9. # 退出root用户
  10. exit
  11. # 退出vagrant用户,退出ssh
  12. exit
  13. vagrant halt # 关闭虚拟机
  14. # 配置VBoxGuestAdditions.iso镜像(VirtualBox界面操作就,添加“虚拟光驱”,${VirtualBox安装目录}\VBoxGuestAdditions.iso)
  15. vagrant up
  16. # 若Vagrant启动没有自动加载VBoxGuestAdditions,则进行手动安装
  17. vagrant ssh
  18. sudo mkdir -p /media/cdrom
  19. sudo mount -t auto /dev/cdrom /media/cdrom/
  20. cd /media/cdrom/
  21. sudo sh VBoxLinuxAdditions.run
  22. exit
  23. vagrant reload

设置box路径

Ø Windows下设置box路径

  1. 添加系统环境变量:
  1. VAGRANT_HOME= E:\vagrant\box

Ø linux/mac下设置box路径

  1. vi ~/.bashrc
  2. export VAGRANT_HOME='/path/to/vagrant_home'
  3. source ~/.bashrc

远程登录

Cygwin远程登录(推荐

  1. # 进入Cygwin命令行窗口
  2. $ cd e:
  3. $ cd vagrant/mybox/centos/centos7.6 && ls
  4. $ vagrant ssh

Vagrant使用手册 - 图1

Xshell远程登录

(1)配置远程连接相关信息,注意端口配置,需要和Vagrantfile一致,如下图由于Vagrantfile中配置了静态私有IP故,可以使用静态IP的22端口(默认SSH端口),或者使用127.0.0.1的2222端口。
Vagrant使用手册 - 图2
(2)用户身份验证配置Public Key方式,用户名为vagrant。(密码方式比较麻烦可自行研究(PasswordAuthentication yes ## 开启ssh__密码登陆),推荐使用Cygwin,无需SSH配置即可登录)
Vagrant使用手册 - 图3
(3)选择用户密钥(.vagrant\machines\centos7.6-node1\virtualbox\private_key)
Vagrant使用手册 - 图4
Vagrant使用手册 - 图5

SecureCRT远程登录

(1)安装Vagrant的Public keys,下载vagrant.pub(公钥)、vagrant(私钥),通过共享目录分享到虚拟机,然后移动到~/.ssh/目录之下。
(2)Public keys权限设置。

  1. # 通过VirtualBox登录虚拟机
  2. cd ~/.ssh
  3. mv vagrant.pub authorized_keys
  4. chmod -R 700 ~/.ssh
  5. chmod -R 600 ~/.ssh/authorized_keys

(3)配置/etc/ssh/sshd_config文件。

  1. # 通过VirtualBox登录虚拟机
  2. sudo vi /etc/ssh/sshd_config

配置如下:

  1. RSAAuthentication yes
  2. PubkeyAuthentication yes
  3. PermitRootLogin yes
  4. PasswordAuthentication yes

重启SSH服务:

  1. sudo service sshd restart

(4)配置SecureCRT连接(密码方式)。
Vagrant使用手册 - 图6
“鉴权”中勾选“Password”,并在“属性”中配置密码。
Vagrant使用手册 - 图7

Vagrant box源

官方box镜像源

  1. Vagrant官方box站点:[https://app.vagrantup.com/boxes/search](https://app.vagrantup.com/boxes/search)。<br />官方box下载技巧:**_下载链接__ = __产品版本链接__URL + /providers/ +__供应商名称(如:__virtualbox/ libvirt/hyperv/vmware_desktop__)__+'.box'__。_**<br />![](https://cdn.nlark.com/yuque/0/2020/png/788484/1594623790070-12c9909a-08b8-42b5-8237-3685bed0e444.png#height=264&id=SrnPu&originHeight=910&originWidth=1430&originalType=binary&ratio=1&status=done&style=none&width=415)

国内box镜像源

系统 站点 镜像源
ubuntu-16.04 清华大学 vagrant box add https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cloud-images/xenial/current/xenial-server-cloudimg-amd64-vagrant.box —name ubuntu/xenial64
ubuntu-18.04 清华大学 vagrant box add \
https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cloud-images/bionic/current/bionic-server-cloudimg-amd64-vagrant.box \
—name ubuntu/bionic

Vagrant常用命令

Vagrant虚拟机操作命令

命令 描述
vagrant init 初始化
vagrant up 启动虚拟机
vagrant halt 关闭虚拟机
vagrant reload 重启虚拟机,vagrant reload —provision(修改配置生效)
vagrant ssh SSH至虚拟机
vagrant suspend 挂起虚拟机
vagrant resume 唤醒虚拟机
vagrant status 查看虚拟机运行状态
vagrant global-status
vagrant global-status —prune # 清除缓存状态
显示当前用户Vagrant的所有环境状态
vagrant destroy 销毁当前虚拟机
vagrant package [—base vm_name] [—output new_box_name] 默认打包当前目录下面的虚拟机,${vmname}为虚拟机名称,非虚拟机主机名或box_名称,导出Box(打包的时候建议把sshd密码登录方式设置为true,官网公钥写入authorized_keys中并设置好权限,这样启动使用这个box的时候系统免密登录一步完成)。打包时虚拟机需要停止,如果没有停止,命令执行时将强制停止虚拟机。
vagrant login 登录Vagrant cloud(该命令已经弃用了,重新命名为vagrant cloud auth login)

Vagrant box操作命令

命令 描述
vagrant box list 查看本地box列表
vagrant box add 添加box到列表
vagrant box remove
vagrant box remove —box-version 0
从box列表移除
- -box-version VALUE:指定要删除的box版本。
- -all:表示要删除box的所有版本。
- -force:强制删除,正在使用也不提示。
- -provider VALUE:删除指定提供者对应的box。
vagrant box repackage 重新打包本地环境中指定的box为新的box

Vagrant插件操作命令

命令 描述
vagrant plugin list 查看插件列表
vagrant plugin install 安装插件
vagrant plugin uninstall 卸载插件

Vagrant单机配置

取消box更新

  1. config.vm.box_check_update = false

关于SSH配置

  1. windows下推荐使用Cygwin,从Cygwin/Git命令行客户端启动Vagrant容器后,可以通过SSH直接连接。

配置box内存、CPU

  1. config.vm.provider "virtualbox" do |v|
  2. v.customize ["modifyvm", :id, "--memory","1024"]
  3. v.customize ["modifyvm", :id, "--cpus", "2"]
  4. end
  1. 另外,也可以直接在Virtualbox上修改内存、CPU配置。

配置共享目录

  1. # 命令格式
  2. config.vm.synced_folder
  3. "your_folder" # 必选:物理机目录,可以是绝对地址或相对地址,相对地址是指相对与vagrant配置文件所在目录
  4. ,"vm_folder # 必选:挂载到虚拟机上的目录地址
  5. ,create(boolean) # 可选:默认为false,若配置为true,挂载到虚拟机上的目录若不存在则自动创建
  6. ,disabled(boolean) # 可选:默认为false,若为true,则禁用该项挂载
  7. ,owner(string) # 可选:虚拟机系统下文件所有者(确保系统下有该用户,否则会报错),默认:vagrant
  8. ,group(string) # 可选:虚拟机系统下文件所有组( (确保系统下有该用户组,否则会报错),默认:vagrant
  9. ,mount_options # 可选:["dmode=775","fmode=664"],dmode配置目录权限,fmode配置文件权限 ,默认:777
  10. ,type(string) # 可选:指定文件共享方式,例如:'nfs',vagrant默认根据系统环境选择最佳的文件共享方式
  11. # egg
  12. config.vm.synced_folder ".", "/share", type: "virtualbox"
  13. config.vm.synced_folder
  14. "D:/www/code"
  15. ,"/code"
  16. ,owner:"root"
  17. ,group:"root"
  18. ,create:true
  19. ,mount_options:["dmode=775","fmode=664"]
  20. config.vm.synced_folder ".","/vagrant",disabled:true # 禁用vagrant的默认共享目录
  1. **_注意:默认情况下__Vagrant__会将当前目录和__/vagrant__目录进行绑定共享,故自定义时推荐不要使用__/vagrant___**<br />**_ _**Vagrant的共享目录默认类型为virtualbox,其性能相较其他类型要低,推荐使用nfs替代默认类型。
  1. # 插件安装
  2. vagrant plugin install vagrant-bindfs

配置如下:

  1. config.vm.synced_folder "./app", "/mnt/app-data", type: "nfs"
  2. config.bindfs.bind_folder "/mnt/app-data","/app",force_user:"root",force_group:"root",o:"nonempty"

配置网络

  1. # (1)端口转发(端口映射指将宿主计算机的端口映射到虚拟机上的某个端口上,访问宿主计算机的该端口时,请求实际会被转发到虚拟机上指定的端口,默认只转发TCP包,UDP需要声明,另外:不支持在宿主机器上使用小于1024的端口来转发(如:不能使用SSL的443端口来进行https连接))
  2. config.vm.network "forwarded_port", guest: 80, host: 8888 ,id: 'nginx'
  3. config.vm.forwarded_port 80, 8080, protocol: "udp"
  4. # (2)私有网络(私有网络只有主机可以访问虚拟机,如果多个虚拟机设置定在同一个网段也可以相互访问,当然虚拟机也是可以访问外部网络的,配置时与路由器IP网段不能冲突)
  5. config.vm.network "private_network",ip:"192.168.0.101"
  6. # (3)公有网络(公有网络虚拟机与实体机一样的网络配置,路由器分配IP,vagrant 1.3版本以后支持设定固定IP)
  7. config.vm.network "public_network" # 旧版本默认只能自动分配IP
  8. config.vm.network "public_network",ip:"192.168.0.101"

验证:

  1. # 端口占用查看(以下命令均可以运行在Cygwin上)
  2. netstat -aon|findstr "8080" # window下使用
  3. netstat -aon|grep "8080"

配置虚拟机主机名

  1. config.vm.hostname = "centos7.6-node1"
  1. **_注意:__虚拟机的主机名设置应该只包含字母,数字,连字符或点。_**

配置虚拟机名

  1. config.vm.provider "virtualbox" do |v|
  2. v.customize ["modifyvm", :id, "--name", "centos7.6-node1"]
  3. end

Vagrant集群搭建

集群主机配置

  1. # 节点node1
  2. config.vm.define "node1" do |node1|
  3. node1.vm.hostname = "vagrant-centos7.6-node1"
  4. end
  5. # 节点node2
  6. config.vm.define "node2" do |node2|
  7. node2.vm.hostname = "vagrant-centos7.6-node2"
  8. end

集群网络配置

  1. # 节点node1
  2. config.vm.define "node1" do |node1|
  3. node1.vm.network "private_network",ip:"192.168.0.101"
  4. end
  5. # 节点node2
  6. config.vm.define "node2" do |node2|
  7. node2.vm.network "private_network",ip:"192.168.0.102"
  8. end

验证:

  1. # 验证宿主机及节点间的连通性
  2. vagrant up # vagrant up node1/ vagrant up node2
  3. vagrant status
  4. # 宿主机验证与虚拟机节点的通讯
  5. ping 192.168.0.101
  6. ping 192.168.0.102
  7. # 虚拟机节点之间的通讯
  8. vagrant ssh node1 # vagrant ssh node2
  9. ping 192.168.0.101
  10. ping 192.168.0.102
  11. # 端口占用查看(以下命令均可以运行在Cygwin上)
  12. netstat -aon|findstr "8080" # window下使用
  13. netstat -aon|grep "8080"

集群共享目录

  1. # 节点node1
  2. config.vm.define "node1" do |node1|
  3. node1.vm.synced_folder "node1", "/share", type: "virtualbox"
  4. end
  5. # 节点node2
  6. config.vm.define "node2" do |node2|
  7. node2.vm.synced_folder "node2", "/share", type: "virtualbox"
  8. end

集群主机名管理插件

  1. # 安装vagrant-hostmanager插件
  2. vagrant plugin install vagrant-hostmanager

配置如下:

  1. # Vagrantfile中配置vagrant-hostmanager
  2. config.hostmanager.enabled = true
  3. config.hostmanager.manage_guest = true
  4. config.hostmanager.manage_host = true

验证:

  1. # 更新hosts文件
  2. vagrant hostmanager
  3. # 宿主机验证与虚拟机节点的通讯
  4. ping vagrant-centos7.6-node1 # ping vagrant-centos7.6-node2
  5. # 虚拟机节点之间的通讯
  6. vagrant ssh node1 # vagrant ssh node2
  7. ping vagrant-centos7.6-node1 # ping vagrant-centos7.6-node2

Vagrant provision

生命周期

  1. ProvisioningVagrant环境生命周期的特定节点执行:第一次vagrant up创建环境时,provisioning会运行。如果环境已经创建,并且up操作只是恢复或启动一个节点,provisioning 将不会运行,除非明确提供--provision标志。调用vagrant reload --provision时,--provision标志必须存在才能强制执行provisioning。启动时指定--no-provision可避免运行provisioner。<br /> **_Tips_**: 运行后可能会提示**___default: stdin: is not a tty___**错误,不影响执行效果,想要去除,在配置文件增加一行即可。
  1. config.ssh.shell = "bash -c 'BASH_ENV=/etc/profile exec bash'"

执行单行脚本

  1. 对于inline模式,命令只能在写在一行中,一个以上的命令,可以写在同一行,用分号分隔,也可以写多个单行脚本。
  1. # 风格1
  2. config.vm.provision "shell", inline: "echo hello provisio."
  3. # 风格2
  4. config.vm.provision "shell" do |s|
  5. s.inline = "echo hello provision."
  6. end
  1. **_Tips_**: provisioner命名块如果重名,会有覆盖问题。一个shell节点内,如果连续写一条以上s.inline,则只有最后一条有效,前面的会被后面的覆盖掉。

执行内联脚本

  1. 如果要执行脚本较多,可以在Vagrantfile中指定内联脚本,在Vagrant.configure节点外面,写入命名内联脚本:
  1. $script = <<SCRIPT
  2. echo I am provisioning...
  3. echo hello provision.
  4. SCRIPT
  5. config.vm.provision "shell", inline: $script

执行外部脚本

  1. config.vm.provision "shell", privileged: true, path: "./setup.sh"
  2. # Tips:path可以使用http/https来访问远程脚本,这个在部署时访问一个脚本仓库来做一些通用的操作,比较方便。如:
  3. config.vm.provision "shell", path: "https://example.com/provisioner.sh"

脚本参数

  1. 如果要执行的脚本需要参数,那么使用args属性进行传递:
  1. config.vm.provision "shell" do |s|
  2. s.inline = "echo $1"
  3. s.args = "'hello, world!'"
  4. end
  5. # Tips: 这两args有两层引号,如果去掉一层,字符串中的逗号会让shell以为是两个参数,那么后面的world会被丢掉。
  6. 你也可以使用方括号作为外层分隔符,而内层分隔符使用单引号或双引号都可以,只要前后匹配即可,如:
  7. s.args = ["hello, world!"]

环境变量

  1. 为命令行指定环境变量,env的格式为hash,是一个hash对象的列表,多个环境变量,多次配置env
  1. config.vm.provision "shell" do |s|
  2. s.inline = "echo $1 $JAVA_HOME"
  3. s.env = {JAVA_HOME:"/opt/java"}
  4. s.args = ["java_home is "]
  5. end

文件操作

  1. file操作有两个参数:source (源文件或文件夹)、destination(目标文件或文件),作用是将host主机的${source}上传到vm虚拟机的目标文件${destination}。
  1. config.vm.provision "file", source: "./Vagrantfile", destination: "Vagrantfile"

Vagrant安装实例

实例描述 插件 Vagrantfile__文件
类型:单机
虚拟机名称:centos7.6_node1
虚拟主机名称:centos7.6-node1
box名称:centos7.6
共享目录:/share => . type: “virtualbox”
网络配置:私有网络(192.168.0.101)
节点内存:1G
节点CPU个数:1
vagrant-vbguest Vagrantfile.zip
类型:集群(2个节点)
虚拟机名称:cluster_node1、cluster_node2
虚拟主机名称:vagrant-centos7.6-node1、vagrant-centos7.6-node2
box名称:centos7.6
共享目录:/share => . type: “nfs” vagrant/vagrant
网络配置:私有网络(192.168.0.101、192.168.0.102)
节点内存:1G
节点CPU个数:1
vagrant-vbguest
vagrant-hostmanager
vagrant-bindfs
Vagrantfile.zip

附录

附录:A.查看linux系统版本

命令 描述
lsb_release -a 查看当前系统的发行版信息
uname [-r] [-a] 适用于所有的linux,包括Redhat、SuSE、Debian、Centos等发行版
cat /etc/redhat-release 适用于RedHat,CentOS
rpm -q redhat-release
rpm -q centos-release
适用于RedHat,CentOS
cat /proc/version 查看当前centos 版本与redhat对应的版本的命令

附录:B.参考站点

【诱人的Vagrant】https://www.cnblogs.com/hafiz/p/9175484.html
【SecureCRT免密码登录】https://www.cnblogs.com/harrymore/p/8639331.html
【vagrant学习笔记-provision】https://blog.csdn.net/54powerman/article/details/50684844
【B站-vagrant】https://www.bilibili.com/video/av9516581?p=1
【B站-Vagrant搭建本地开发环境】https://www.bilibili.com/video/av34364028?p=1

附录:C.Vagrant Public keys

keys.zip