[转] vagrant系列(2):使用Vagrantfile实现集成预安装
在我们的开发目录下,有一个文件Vagrantfile,里面包含有大量的配置信息,主要包括三个方面:虚拟机配置、SSH配置、基础配置。Vagrant是使用Ruby开发的,所以它的配置语法也是Ruby的,但是没有学过Ruby的人还是可以跟着它的注释,知道如何配置一些基本项。
1.Vagrantfile配置文件详解
- box设置
config.vm.box = "base"
这个配置展示了哪个box会作为虚拟机操作系统,即我们输入vagrant init name_box时所指定的box。如果沒有输入box名称,vagrant默认是base。
- 虚拟机名称设置
config.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--name", "centos7", "--memory", "512"]
end
VirtualBox提供了命令行工具VBoxManage,使我们可以设定虚拟机的配置。用modifyvm 指定虚拟机的名称和内存大小,这里的名称指的是在VirtualBox中显示的名称。上述会设置虚拟机名为centos7,内存为512MB。
- 网络设置
config.vm.network "private_network", ip: "192.168.10.11"
//Host-only模式
config.vm.network "public_network", ip: "10.1.2.61"
//Bridge模式
Vagrant有两种方式来进行网络连接:一种是Host-only(主机模式),是主机和虚拟机之间的网络互访,而不是虚拟机访问internet;另一种是Bridge(桥接模式),该模式下的虚拟机就像是局域网中的一台独立的主机,也就是说需要虚拟机到你的路由器要IP,这样的话局域网里面其他机器就可以访问它。上述配置,我们选择host-only模式,指定一个IP,IP的话建议最好不要用192.168.x.x网段,因为很有可能和你局域网里面的其它机器IP冲突,所以最好使用类似11.11.x.x这样的IP地址。
- 虚拟机hostname设置
config.vm.hostname = "centos7"
设置hostname非常重要,因为当我们有多台虚拟主机时,需要hostname进行识别,比如我们安装了centos7-01、centos7-02两台虚拟机,再启动时,可以通过vagrant up centos7-01指定只启动哪一台。还有配置管理工具Puppet、Chef、Ansible,都是通过hostname识别。
- 共享目录
config.vm.synced_folder "/Users/jackyue/data", "/vagrant_data"
我们说过虚拟机的/vagrant目录默认挂载宿主机的开发目录(可以在进入虚拟机机后,使用df -h 查看),这是在虚拟机启动时自动挂载的。我们还可以设置额外的共享目录,上面这个设定,第一个参数是宿主机的目录,第二个参数是虚拟机挂载的目录。
- 端口转发
config.vm.network :forwarded_port, guest: 80, host: 8080
上面的配置把宿主机上的8080端口映射到客户虚拟机的80端口,例如你在虚拟机上使用nginx跑了一个Go应用,那么你在host上的浏览器中打开http://localhost:8080时,Vagrant就会把这个请求转发到虚拟机里跑在80端口的nginx服务上。个人不建议使用该方法,因为涉及端口占用问题,常常导致应用之间不能正常通信,建议使用Host-only和Bridge方式进行设置。
vagrant reload
修改完Vagrantfile的配置后,记得要重启虚拟机,才能使用虚拟机更新后的配置。
2. 集成预安装
2.1 初次运行
从上文看来,你会发现每次修改了一点内容就打包分发给其他用户,其实这样很麻烦。为此Vagrant提供了更为便捷的预安装定制。打开Vagrantfile文件,末尾处有以下被注释的代码:
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y apache2
SHELL
这段代码就是在你初次运行vagrant up后,创建虚拟机的过程中自动运行的初始化命令。取消注释,把要预先安装的软件和配置都写进去。初始化时,这些程序会根据你写的方法安装并配置。
2.2 重载Vagrantfile
如果你不是初次运行,同时又修改了这里的命令,想让系统再次运行这里面的命令,你可以使用vagrant reload --provision进行重载。这种情况下,你只要将Vagrantfile共享给团队的其他成员就可以了,其他成员运行相同的命令即可,是不是比打包分发要方便许多。
2.3 单独的脚本
你还可以把要运行的命令单独写在一个脚本文件里,然后把其放在Vagrantfile的同级目录下,比如bootstrap.sh:
#!/usr/bin/env bash
apt-get update
apt-get install -y apache2
if ! [ -L /var/www ]; then
rm -rf /var/www
ln -fs /vagrant /var/www
fi
然后在Vagrantfile里添加:
Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/precise64"
...
config.vm.provision "shell", path: "bootstrap.sh" # 添加这行
end
实际效果与直接写在Vagrantfile一样。
3. 模拟搭建多主机的分布式系统
上文的单主机/单虚拟机模式,主要用做开发机。在这一节,我们会介绍在单机上,如何通过虚拟机搭建分布式集群系统。
3.1 单主机/多虚拟机模式适合以下几种场景需求
快速建立产品网络的多机器环境,例如web服务器、db服务器
建立一个分布式系统,学习它们是如何交互的
测试API与其他组件的通信
容灾模拟,网络断网,机器死机,连接超时等情况
3.2 Vagrant支持单机模拟多台虚拟机,它只需要一个Vagrntfile文件就可以定义分布式系统
现在我们建立多台虚拟机,并使它们保持通信。假设其中一台是应用服务器,另一台是DB服务器,第三台是缓存服务器。这个结构在Vagrant中非常简单,我们只需要通过config.vm.define定义不同的角色,设置如下:
Vagrant.configure("2") do |config|
# 定义应用服务器
config.vm.define :web do |web|
web.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--name", "web", "--memory", "512"]
end
web.vm.box = "centos7"
web.vm.hostname = "web"
web.vm.network :private_network, ip: "11.11.1.1"
end
# 定义DB服务器
config.vm.define :db do |db|
db.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--name", "db", "--memory", "512"]
end
db.vm.box = "centos7"
db.vm.hostname = "db"
db.vm.network :private_network, ip: "11.11.1.2"
end
# 定义缓存服务器
config.vm.define :redis do |redis|
redis.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--name", "redis", "--memory", "512"]
end
redis.vm.box = "centos7"
redis.vm.hostname = "redis"
reids.vm.network :private_network, ip: "11.11.1.2"
end
end
3.3 验证分布式集群
与前面的单机配置类似,这里我们使用:web,:db,:redis分別做了三个虚拟机的设置,接着我们启动虚拟机。
$ vagrant up
Bringing machine 'web' up with 'virtualbox' provider...
Bringing machine 'db' up with 'virtualbox' provider...
[web] Setting the name of the VM...
[web] Clearing any previously set forwarded ports...
[web] Creating shared folders metadata...
[web] Clearing any previously set network interfaces...
[web] Preparing network interfaces based on configuration...
[web] Forwarding ports...
[web] -- 22 => 2222 (adapter 1)
[web] Running any VM customizations...
[web] Booting VM...
[web] Waiting for VM to boot. This can take a few minutes.
[web] VM booted and ready for use!
[web] Setting hostname...
[web] Configuring and enabling network interfaces...
[web] Mounting shared folders...
[web] -- /vagrant
[db] Setting the name of the VM...
[db] Clearing any previously set forwarded ports...
[db] Fixed port collision for 22 => 2222. Now on port 2200.
...
看到上面的信息后,我们就可以通过vagrant ssh登录虚拟机,这次我们需要指定相应的角色,告诉ssh连接的是哪一台:
$ vagrant ssh web
$ vagrant ssh db
$ vagrant ssh redis
接下来,我们验证虚拟机之间的通信,让我们先使用ssh登录web虚拟机,然后在web虚拟机上,使用ssh登录db虚拟机(默认用户名、密码是vagrant/vagrant):
JackYuedeMBP:cluster jackyue$ vagrant ssh web
Last login: Tue Apr 25 17:07:36 2017 from 10.0.2.2
[vagrant@web ~]$
[vagrant@web ~]$ ssh 11.11.1.2
The authenticity of host '11.11.1.2 (11.11.1.2)' can't be established.
ECDSA key fingerprint is 7a:f6:47:1b:a9:04:c8:c6:90:d5:8c:48:14:03:d3:64.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '11.11.1.2' (ECDSA) to the list of known hosts.
vagrant@11.11.1.2's password:
Last login: Tue Apr 25 17:07:44 2017 from 10.0.2.2
[vagrant@db ~]$
[vagrant@db ~]$ ssh 11.11.1.3
The authenticity of host '11.11.1.3 (11.11.1.3)' can't be established.
ECDSA key fingerprint is 7a:f6:47:1b:a9:04:c8:c6:90:d5:8c:48:14:03:d3:64.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '11.11.1.3' (ECDSA) to the list of known hosts.
vagrant@11.11.1.3's password:
Last login: Tue Apr 25 17:07:52 2017 from 10.0.2.2
[vagrant@redis ~]$
[vagrant@redis ~]$ ssh 11.11.1.4
The authenticity of host '11.11.1.4 (11.11.1.4)' can't be established.
ECDSA key fingerprint is 7a:f6:47:1b:a9:04:c8:c6:90:d5:8c:48:14:03:d3:64.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '11.11.1.4' (ECDSA) to the list of known hosts.
vagrant@11.11.1.4's password:
Last login: Tue Apr 25 17:08:44 2017 from 10.0.2.2
[vagrant@web ~]$
通过上面的信息,我们看到虚拟机之间通信正常。现在开始你伟大的架构设计吧,你想设计怎样的架构都可以,唯一限制你的就是主机的硬件配置了。
4.参考文献
[转] vagrant系列(2):使用Vagrantfile实现集成预安装的更多相关文章
- Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问
本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...
- vagrant系列教程(一):vagrant的安装与初识(转)
[参考]https://github.com/astaxie/go-best-practice/blob/master/ebook/zh/01.1.md 阅读目录 下载一个合适的box 完成一个box ...
- SpringBoot系列之Spring Data Jpa集成教程
SpringBoot系列之Spring Data Jpa集成教程 Spring Data Jpa是属于Spring Data的一个子项目,Spring data项目是一款集成了很多数据操作的项目,其下 ...
- Vagrant系列(一)----win10搭建Vagrant+VirtualBox环境_
一.Vagrant是什么? vagrant是一个操作虚拟机的工具.是一个基于Ruby的工具,用于创建和部署虚拟化开发环境. 通过命令和配置文件来管理虚拟机,很快就能完成一套开发环境的 ...
- Linux下xampp集成环境安装配置方法 、部署bugfree及部署禅道
XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建站集成软件包.XAMPP 是一个易于安装且包含 MySQL.PHP 和 Perl 的 Apache 发行版.XAMPP 的确非 ...
- Atitit 发帖机系列(6) USRQBN2201 setup spec安装程序的实现规范与标准化解决方案
Atitit 发帖机系列(6) USRQBN2201 setup spec安装程序的实现规范与标准化解决方案 安装主要解决一个问题,就是resin的内容启动路径以及端口..这里是使用的端口8077 主 ...
- .Neter玩转Linux系列之六:Linux下MySQL的安装、配置、使用
一.Linux安装MySQL (1)下载安装包:https://dev.mysql.com/downloads/mysql/ (2)解压并安装 命令:tar zxvf 文件名 解压完成之后,重名一下文 ...
- Golang学习系列:(一)介绍和安装
Golang学习系列:(一)介绍和安装 Java程序员带你来到Go的世界,让我们开始探索吧! Go是一种新的语言,一种并发的,带有垃圾回收的.快速编译的语言,它具有一下特点: 他可以在一台计算机上用几 ...
- Reporting Service服务SharePoint集成模式安装配置(3、4、安装sharepoint 2010必备组件及产品)
Reporting Service服务SharePoint集成模式安装配置 第三步和第四部 第三步 安装sharepoint 2010必备组件 1.安装SharePoint2010必备组件,执行Pre ...
随机推荐
- vscode安装设置go
vscode安装设置go vscode安装go配置 1.下载最新的vscode: https://code.visualstudio.com/docs/?dv=win 2.下载go: https:// ...
- oracle 环境变量(中文显示乱码)
NLS_LANGSIMPLIFIED CHINESE_CHINA.ZHS16GBK
- 白盒测试实践--Day0
白盒测试实践--Day0 累计完成任务情况: 阶段内容 参与人 开会学习作业要求,取得共识 全体 注: 1."阶段内容"划斜线表示完成. 2.采用倒序. 具体情况: 组长提前组织分 ...
- 视觉SLAM实战(一):RGB-D SLAM V2
写在前面 首先打个广告.SLAM研究者交流QQ群:254787961.欢迎各路大神和小白前来交流. 看了前面三篇博文之后,是不是有同学要问:博主你扯了那么多有用没用的东西,能不能再给力一点,拿出一个我 ...
- k8s启动Pod遇到CrashLoopBackOff的解决方法
1.用kubectl get pod 当看到上面的状态后执行第2步 2.查看pod详情 [root@cc hzb]# kubectl describe pod ceph-mysql-hzb-pod 找 ...
- (I/O流)在100ms内桌面上生成一个200M大小的文件
最终速度取决于硬盘的读写速度 package com.laurdawn; import java.io.File; import java.io.FileInputStream; import jav ...
- WorkFlow 工作流 学习笔记
传统ERP为制造业企业产供销人财物的管理提供了一整套优化企业资源利用,集物流.信息流.资金流为一体的现代化管理工具.但是它在过程集成和企业间集成方面存在不足.具体表现在: 1.传统ERP是一个面向功能 ...
- Vc6.0 编译发生致命链接错误 :不能打开exe的文件
错误: fatal error LNK1104: cannot open file "Debug/CeshiToolBar1.exe" 解决方法:打开任务管理器,找到对应的exe应 ...
- [教学] Log.d 日志调试查看(所有平台)
Firemonkey 提供了一个跨平台的日志显示函数 Log.d,当 App 越来越大 Debug 编译越来越慢时,可以利用它在 Release 模式来除错,下列说明如何在各平台查看. 小技巧:可以在 ...
- Rabbimq必备基础之对高级消息队列协议AMQP分析及Rabbitmq本质介绍
MQ的一个产品... [消息队列] 1. MSMQ windows自带的一个服务... [petshop],message存放在文件系统中. 最原始的消息队列... [集群,消息确认,内存化,高可用, ...