[转] 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 ...
随机推荐
- Red Hat 6.5 本地yum源的配置
在没有网络的情况下,想要使用yum源进行软件的安装就显得非常困难了.所以有时候配置本地的yum源也是非常必要的. 准备工作: rad hat 的ISO镜像文件. 1.创建一个文件夹,用于挂载ISO镜像 ...
- linux安装memcache及memcache扩展
一.安装libevent# wget http://www.monkey.org/~provos/libevent-2.0.12-stable.tar.gz# tar zxf libevent-2.0 ...
- Spring.NET 整合Nhibernate
因为最近无意中学了AOP ,所以想一探究竟,看看.net里这个Spring.Net 到底是怎么回事,请有需要的童鞋往下,不需要的请alt+w.因为是先配置的 Nhibernate 所以就从这个开始.开 ...
- C++ 控制台编程
播放媒体文件 #include<windows.h> #program <mmsystem.h> #pragma comment(lib,"winmm.lib&quo ...
- leetcode 反转字符串
请编写一个函数,其功能是将输入的字符串反转过来. 示例: 输入:s = "hello" 返回:"olleh" /** * @param {string} s * ...
- Entity Framework中的连接管理
EF框架对数据库的连接提供了一系列的默认行为,通常情况下不需要我们太多的关注.但是,这种封装,降低了灵活性,有时我们需要对数据库连接加以控制. EF提供了两种方案控制数据库连接: 传递到Context ...
- Python【读取文件,第一行与最后一行】
文件小的读取方法 with open("a1.txt","r",encoding="gbk") as f: r = f.readlines( ...
- PT, BPT, VCM
- VCM可以理解为BPT与PPM之间的MIS,并没有比BPT效果好很多 - BPT, VCM这类算法的主要作用是加快caustics的收敛,对indirect diffuse没有很明显的加速 - i ...
- Data Base Oracle 常用命令
Data Base Oracle 常用命令 1.登录:(不需要密码,属于管理员权限) conn /as sysdba; 2.查看数据库存储位置: select name from v$datafil ...
- luogu AC自动机(模板)
完全忘了AC自动机怎么写了qwq,更别说AC自动机上DP了. 今天就好好地学习字符串好了qwq 提一下AC自动机的时间复杂度--设n是模式串的个数,m是文本串的长度,l是模式串的平均长度,那么它的时间 ...