文档编号:[pxxx - ]xxx - 1xx - ymd - xxxx | 说明(保持文档结构,内容多则加附件) |
---|---|
规则:([项目代码/编号-]文档类别/简介-组员编号-填写日期-流水号) […]表示可选项 |
系统环境
- 宿主机:Windows8企业版
- 虚拟机:VirtualBox
- 虚拟机IP: 192.168.0.101、192.168.0.102、192.168.0.103
- 命令行终端:cygwin/MobaXterm
- 操作用户:vagrant/vagrant
资源站点
| 组件 | 下载站点 | | —- | —- | | vagrant_1.9.3.msi | https://www.vagrantup.com/downloads.html
https://releases.hashicorp.com/vagrant/ | | VirtualBox-5.1.18-114002.exe | https://www.virtualbox.org/wiki/Downloads | | cygwin-v2.8.9.7_setup-x86_64.exe | http://www.cygwin.com | | Vagrant公钥(你懂的或者迅雷下载) | http://github.com/mitchellh/vagrant/raw/master/keys/vagrant.pub | | Vagrant私钥(你懂的或者迅雷下载) | http://github.com/mitchellh/vagrant/raw/master/keys/vagrant | | VagrantBox资源库 | http://www.vagrantbox.es |
安装VirtualBox
安装过程略,**_注意:在安装__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路径的配置。
设置共享目录
Vagrant需要先安装virtualbox guest addtions才能开启Virtualbox目录共享功能。未开启时启动虚拟机将会抛出异常**_“__unknown filesystem type ‘vboxsf’__”_**。解决方案如下:
# 示例(Cygwin客户端)
cd /cygdrive/e/vagrant/mybox/bigdata
vagrant up && vagrant ssh
# 使用root用户更新系统组件(配置yum源过程省略)
sudo su
rm -f /var/run/yum.pid # 当出现"Another app is currently holding the yum lock; waiting for it to exit..."时执行
yum update
yum install -y gcc gcc-devel gcc-c++ gcc-c++-devel make kernel kernel-devel
# 退出root用户
exit
# 退出vagrant用户,退出ssh
exit
vagrant halt # 关闭虚拟机
# 配置VBoxGuestAdditions.iso镜像(VirtualBox界面操作就,添加“虚拟光驱”,${VirtualBox安装目录}\VBoxGuestAdditions.iso)
vagrant up
# 若Vagrant启动没有自动加载VBoxGuestAdditions,则进行手动安装
vagrant ssh
sudo mkdir -p /media/cdrom
sudo mount -t auto /dev/cdrom /media/cdrom/
cd /media/cdrom/
sudo sh VBoxLinuxAdditions.run
exit
vagrant reload
设置box路径
Ø Windows下设置box路径
添加系统环境变量:
VAGRANT_HOME= E:\vagrant\box
Ø linux/mac下设置box路径
vi ~/.bashrc
export VAGRANT_HOME='/path/to/vagrant_home'
source ~/.bashrc
远程登录
Cygwin远程登录(推荐)
# 进入Cygwin命令行窗口
$ cd e:
$ cd vagrant/mybox/centos/centos7.6 && ls
$ vagrant ssh
Xshell远程登录
(1)配置远程连接相关信息,注意端口配置,需要和Vagrantfile一致,如下图由于Vagrantfile中配置了静态私有IP故,可以使用静态IP的22端口(默认SSH端口),或者使用127.0.0.1的2222端口。
(2)用户身份验证配置Public Key方式,用户名为vagrant。(密码方式比较麻烦可自行研究(PasswordAuthentication yes ## 开启ssh__密码登陆),推荐使用Cygwin,无需SSH配置即可登录)
(3)选择用户密钥(.vagrant\machines\centos7.6-node1\virtualbox\private_key)
SecureCRT远程登录
(1)安装Vagrant的Public keys,下载vagrant.pub(公钥)、vagrant(私钥),通过共享目录分享到虚拟机,然后移动到~/.ssh/目录之下。
(2)Public keys权限设置。
# 通过VirtualBox登录虚拟机
cd ~/.ssh
mv vagrant.pub authorized_keys
chmod -R 700 ~/.ssh
chmod -R 600 ~/.ssh/authorized_keys
(3)配置/etc/ssh/sshd_config文件。
# 通过VirtualBox登录虚拟机
sudo vi /etc/ssh/sshd_config
配置如下:
RSAAuthentication yes
PubkeyAuthentication yes
PermitRootLogin yes
PasswordAuthentication yes
重启SSH服务:
sudo service sshd restart
(4)配置SecureCRT连接(密码方式)。
“鉴权”中勾选“Password”,并在“属性”中配置密码。
Vagrant box源
官方box镜像源
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列表移除 - -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更新
config.vm.box_check_update = false
关于SSH配置
windows下推荐使用Cygwin,从Cygwin/Git命令行客户端启动Vagrant容器后,可以通过SSH直接连接。
配置box内存、CPU
config.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--memory","1024"]
v.customize ["modifyvm", :id, "--cpus", "2"]
end
另外,也可以直接在Virtualbox上修改内存、CPU配置。
配置共享目录
# 命令格式
config.vm.synced_folder
"your_folder" # 必选:物理机目录,可以是绝对地址或相对地址,相对地址是指相对与vagrant配置文件所在目录
,"vm_folder # 必选:挂载到虚拟机上的目录地址
,create(boolean) # 可选:默认为false,若配置为true,挂载到虚拟机上的目录若不存在则自动创建
,disabled(boolean) # 可选:默认为false,若为true,则禁用该项挂载
,owner(string) # 可选:虚拟机系统下文件所有者(确保系统下有该用户,否则会报错),默认:vagrant
,group(string) # 可选:虚拟机系统下文件所有组( (确保系统下有该用户组,否则会报错),默认:vagrant
,mount_options # 可选:["dmode=775","fmode=664"],dmode配置目录权限,fmode配置文件权限 ,默认:777
,type(string) # 可选:指定文件共享方式,例如:'nfs',vagrant默认根据系统环境选择最佳的文件共享方式
# egg
config.vm.synced_folder ".", "/share", type: "virtualbox"
config.vm.synced_folder
"D:/www/code"
,"/code"
,owner:"root"
,group:"root"
,create:true
,mount_options:["dmode=775","fmode=664"]
config.vm.synced_folder ".","/vagrant",disabled:true # 禁用vagrant的默认共享目录
**_注意:默认情况下__Vagrant__会将当前目录和__/vagrant__目录进行绑定共享,故自定义时推荐不要使用__/vagrant__。_**<br />**_ _**Vagrant的共享目录默认类型为virtualbox,其性能相较其他类型要低,推荐使用nfs替代默认类型。
# 插件安装
vagrant plugin install vagrant-bindfs
配置如下:
config.vm.synced_folder "./app", "/mnt/app-data", type: "nfs"
config.bindfs.bind_folder "/mnt/app-data","/app",force_user:"root",force_group:"root",o:"nonempty"
配置网络
# (1)端口转发(端口映射指将宿主计算机的端口映射到虚拟机上的某个端口上,访问宿主计算机的该端口时,请求实际会被转发到虚拟机上指定的端口,默认只转发TCP包,UDP需要声明,另外:不支持在宿主机器上使用小于1024的端口来转发(如:不能使用SSL的443端口来进行https连接))
config.vm.network "forwarded_port", guest: 80, host: 8888 ,id: 'nginx'
config.vm.forwarded_port 80, 8080, protocol: "udp"
# (2)私有网络(私有网络只有主机可以访问虚拟机,如果多个虚拟机设置定在同一个网段也可以相互访问,当然虚拟机也是可以访问外部网络的,配置时与路由器IP网段不能冲突)
config.vm.network "private_network",ip:"192.168.0.101"
# (3)公有网络(公有网络虚拟机与实体机一样的网络配置,路由器分配IP,vagrant 1.3版本以后支持设定固定IP)
config.vm.network "public_network" # 旧版本默认只能自动分配IP
config.vm.network "public_network",ip:"192.168.0.101"
验证:
# 端口占用查看(以下命令均可以运行在Cygwin上)
netstat -aon|findstr "8080" # window下使用
netstat -aon|grep "8080"
配置虚拟机主机名
config.vm.hostname = "centos7.6-node1"
**_注意:__虚拟机的主机名设置应该只包含字母,数字,连字符或点。_**
配置虚拟机名
config.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--name", "centos7.6-node1"]
end
Vagrant集群搭建
集群主机配置
# 节点node1
config.vm.define "node1" do |node1|
node1.vm.hostname = "vagrant-centos7.6-node1"
end
# 节点node2
config.vm.define "node2" do |node2|
node2.vm.hostname = "vagrant-centos7.6-node2"
end
集群网络配置
# 节点node1
config.vm.define "node1" do |node1|
node1.vm.network "private_network",ip:"192.168.0.101"
end
# 节点node2
config.vm.define "node2" do |node2|
node2.vm.network "private_network",ip:"192.168.0.102"
end
验证:
# 验证宿主机及节点间的连通性
vagrant up # vagrant up node1/ vagrant up node2
vagrant status
# 宿主机验证与虚拟机节点的通讯
ping 192.168.0.101
ping 192.168.0.102
# 虚拟机节点之间的通讯
vagrant ssh node1 # vagrant ssh node2
ping 192.168.0.101
ping 192.168.0.102
# 端口占用查看(以下命令均可以运行在Cygwin上)
netstat -aon|findstr "8080" # window下使用
netstat -aon|grep "8080"
集群共享目录
# 节点node1
config.vm.define "node1" do |node1|
node1.vm.synced_folder "node1", "/share", type: "virtualbox"
end
# 节点node2
config.vm.define "node2" do |node2|
node2.vm.synced_folder "node2", "/share", type: "virtualbox"
end
集群主机名管理插件
# 安装vagrant-hostmanager插件
vagrant plugin install vagrant-hostmanager
配置如下:
# Vagrantfile中配置vagrant-hostmanager
config.hostmanager.enabled = true
config.hostmanager.manage_guest = true
config.hostmanager.manage_host = true
验证:
# 更新hosts文件
vagrant hostmanager
# 宿主机验证与虚拟机节点的通讯
ping vagrant-centos7.6-node1 # ping vagrant-centos7.6-node2
# 虚拟机节点之间的通讯
vagrant ssh node1 # vagrant ssh node2
ping vagrant-centos7.6-node1 # ping vagrant-centos7.6-node2
Vagrant provision
生命周期
Provisioning在Vagrant环境生命周期的特定节点执行:第一次vagrant up创建环境时,provisioning会运行。如果环境已经创建,并且up操作只是恢复或启动一个节点,provisioning 将不会运行,除非明确提供--provision标志。调用vagrant reload --provision时,--provision标志必须存在才能强制执行provisioning。启动时指定--no-provision可避免运行provisioner。<br /> **_Tips_**: 运行后可能会提示**_“__default: stdin: is not a tty__”_**错误,不影响执行效果,想要去除,在配置文件增加一行即可。
config.ssh.shell = "bash -c 'BASH_ENV=/etc/profile exec bash'"
执行单行脚本
对于inline模式,命令只能在写在一行中,一个以上的命令,可以写在同一行,用分号分隔,也可以写多个单行脚本。
# 风格1
config.vm.provision "shell", inline: "echo hello provisio."
# 风格2
config.vm.provision "shell" do |s|
s.inline = "echo hello provision."
end
**_Tips_**: provisioner命名块如果重名,会有覆盖问题。一个shell节点内,如果连续写一条以上s.inline,则只有最后一条有效,前面的会被后面的覆盖掉。
执行内联脚本
如果要执行脚本较多,可以在Vagrantfile中指定内联脚本,在Vagrant.configure节点外面,写入命名内联脚本:
$script = <<SCRIPT
echo I am provisioning...
echo hello provision.
SCRIPT
config.vm.provision "shell", inline: $script
执行外部脚本
config.vm.provision "shell", privileged: true, path: "./setup.sh"
# Tips:path可以使用http/https来访问远程脚本,这个在部署时访问一个脚本仓库来做一些通用的操作,比较方便。如:
config.vm.provision "shell", path: "https://example.com/provisioner.sh"
脚本参数
如果要执行的脚本需要参数,那么使用args属性进行传递:
config.vm.provision "shell" do |s|
s.inline = "echo $1"
s.args = "'hello, world!'"
end
# Tips: 这两args有两层引号,如果去掉一层,字符串中的逗号会让shell以为是两个参数,那么后面的world会被丢掉。
你也可以使用方括号作为外层分隔符,而内层分隔符使用单引号或双引号都可以,只要前后匹配即可,如:
s.args = ["hello, world!"]
环境变量
为命令行指定环境变量,env的格式为hash,是一个hash对象的列表,多个环境变量,多次配置env。
config.vm.provision "shell" do |s|
s.inline = "echo $1 $JAVA_HOME"
s.env = {JAVA_HOME:"/opt/java"}
s.args = ["java_home is "]
end
文件操作
file操作有两个参数:source (源文件或文件夹)、destination(目标文件或文件),作用是将host主机的${source}上传到vm虚拟机的目标文件${destination}。
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