[转] 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 ...
随机推荐
- 独立看门狗实验-IWDG
为什么要看门狗? 注意:喂狗是0XAAAA写到KR. 头文件iwdg.h iwdg.c
- JS中的唯一容器:数组
JS中的唯一容器:数组 一.什么类型的数据都可以存储 二. 定义的方式有两种 1 . var arra=[];var arra=[“a”,“b”,"c"]; 2.v ...
- 项目中遇到的死锁问题: Lock wait timeout exceeded; try restarting transaction
最近项目中频繁出现 Lock wait timeout exceeded; try restarting transaction这个错误,把我们弄得痛苦不堪啊,为了解决问题,上网上找好多资料,终于把 ...
- [GO]面向对象和面对过程的方式
package main import ( "fmt" ) //这里为面向过程的方式 func Add(a, b int) int { return a + b } //面向对象, ...
- python-字符串-技巧
1.删除字符串末尾空白:rstrip函数 test1 = "This is a test " print(test1.rstrip()) 但是这种删除只是暂时的,如果想永久删除,则 ...
- ASP.NET JSON数据转实体类方式
实体类 public class FlieList { public string file_unid { get; set; } public string file_name { get; set ...
- Apache mod_rewrite规则重写的标志说明
1.R[=code](force redirect) 强制外部重定向,强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的 ...
- 设计模式16:Mediator 中介者模式(行为型模式)
Mediator 中介者模式(行为型模式) 依赖关系的转化 动机(Motivation) 在软件构建过程中,经常出现多个对象互相关联交互的情况,对象之间经常会维持一种复杂的应用关系,如果遇到一些需求的 ...
- 浅析Java语言慢的原因
Java在早期(比如JDK1.2以前)是很慢的,后续版本由于有许多优化手段的加入,Java正变得越来越快,所以现在也有很多关于Java和C/C++孰快孰慢的争论.我想就我自己的理解,谈一下影响Java ...
- Partition--分区Demo
--============================================================= --创建分区函数 --创建500分区,分区键按照1000依次递增 CRE ...