[转] 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 ...
随机推荐
- Visual Studio 2015 开发 ASP.NET 5 有何变化?(转)
出处:http://www.cnblogs.com/xishuai/p/visual-studio-2015-preview-asp-net-5-change.html 本篇博文目录: ASP.NET ...
- GitHub 出现这样的问题怎么办
一开始以为是被墙,憋个半死. 后来自己好了(大概过了一上午),虚惊一场.
- VC6.0加载lib文件的三种方法
MFC编写程序,都要用到动态链接库,MFC相关的动态库有MFCD42和MFC42等,MFC框架程序已经自动加载,那么如何引入第三方的动态链接库到工程中呢? 静态链接库是要先把程序中所需要使用的函数编译 ...
- Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
环境:linux,mysql5.5.21 错误:Host is blocked because of many connection errors; unblock with 'mysqladmin ...
- Delphi IOS开发环境安装
RAD Delphi XE/10 Seattle 安装IOS.OSX环境安装,IOS模拟器,MAC X 真机可以调试 http://community.embarcadero.com/blogs/en ...
- MVC4 Model ControllerDescriptor
1. ControllerDescriptor 的描述 Controller 的Action 方法有以下一些特性: 1.1 ActionNameAttribute特性 他继承自 System.We ...
- vmware虚拟机监控数据
在vsphere产品中内建一个监控所有虚机包括主机资源的插件,叫做vcenter servcie status,这个插件的主要功能是记录当前虚拟机资源的cpu.硬盘.内存和网络等相关信息.通过它可以查 ...
- 关于C#/sqlserver生成32位数据库字段总结
一.C#中用Guid.NewGuid().ToString() Sql中用NEWID() 以上方法生成的是36位的GUID,如果需要转换成32位,则需要替换掉其中的'-'字符. Sql中的方法:r ...
- 一步一步教你如何制件 ZKEACMS 的扩展组件/插件
前言 如果你还不知道ZKEACMS,不妨先了解一下. ASP.NET MVC 开源建站系统 ZKEACMS 推荐,从此网站“拼”起来 官方地址:http://www.zkea.net/zkeacms ...
- Centos故障01:Docker容器丢失
问题 一测试环境,配置及应用如下: [Centos ~]# rpm -q centos-release centos-release-7-6.1810.2.el7.centos.x86_64 应用: ...