vagrant系列(2):使用Vagrantfile实现集成预安装
2017-04-26 00:45
561 查看
在我们的开发目录下,有一个文件Vagrantfile,里面包含有大量的配置信息,主要包括三个方面:虚拟机配置、SSH配置、基础配置。Vagrant是使用Ruby开发的,所以它的配置语法也是Ruby的,但是没有学过Ruby的人还是可以跟着它的注释,知道如何配置一些基本项。
这个配置展示了哪个box会作为虚拟机操作系统,即我们输入
虚拟机名称设置
VirtualBox提供了命令行工具VBoxManage,使我们可以设定虚拟机的配置。用
网络设置
Vagrant有两种方式来进行网络连接:一种是Host-only(主机模式),是主机和虚拟机之间的网络互访,而不是虚拟机访问internet;另一种是Bridge(桥接模式),该模式下的虚拟机就像是局域网中的一台独立的主机,也就是说需要虚拟机到你的路由器要IP,这样的话局域网里面其他机器就可以访问它。上述配置,我们选择host-only模式,指定一个IP,IP的话建议最好不要用192.168.x.x网段,因为很有可能和你局域网里面的其它机器IP冲突,所以最好使用类似11.11.x.x这样的IP地址。
虚拟机hostname设置
设置hostname非常重要,因为当我们有多台虚拟主机时,需要hostname进行识别,比如我们安装了centos7-01、centos7-02两台虚拟机,再启动时,可以通过
共享目录
我们说过虚拟机的/vagrant目录默认挂载宿主机的开发目录(可以在进入虚拟机机后,使用
端口转发
上面的配置把宿主机上的8080端口映射到客户虚拟机的80端口,例如你在虚拟机上使用nginx跑了一个Go应用,那么你在host上的浏览器中打开http://localhost:8080时,Vagrant就会把这个请求转发到虚拟机里跑在80端口的nginx服务上。个人不建议使用该方法,因为涉及端口占用问题,常常导致应用之间不能正常通信,建议使用Host-only和Bridge方式进行设置。
修改完Vagrantfile的配置后,记得要重启虚拟机,才能使用虚拟机更新后的配置。
这段代码就是在你初次运行
然后在Vagrantfile里添加:
实际效果与直接写在Vagrantfile一样。
建立一个分布式系统,学习它们是如何交互的
测试API与其他组件的通信
容灾模拟,网络断网,机器死机,连接超时等情况
看到上面的信息后,我们就可以通过
接下来,我们验证虚拟机之间的通信,让我们先使用ssh登录web虚拟机,然后在web虚拟机上,使用ssh登录db虚拟机(默认用户名、密码是vagrant/vagrant):
通过上面的信息,我们看到虚拟机之间通信正常。现在开始你伟大的架构设计吧,你想设计怎样的架构都可以,唯一限制你的就是主机的硬件配置了。
vagrant系列二:vagrant的配置文件vagrantfile详解
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系列二:vagrant的配置文件vagrantfile详解
相关文章推荐
- 分布式缓存技术redis学习系列(五)——spring-data-redis与JedisPool的区别、使用ShardedJedisPool与spring集成的实现及一致性哈希分析
- 【系列3】使用Dockerfile创建yum安装nginx服务的Centos Docker镜像
- 分布式缓存技术redis学习系列(五)——spring-data-redis与JedisPool的区别、使用ShardedJedisPool与spring集成的实现及一致性哈希分析
- vagrant系列(1):使用vagrant在线/离线安装centos7
- solr 7+tomcat 8 + mysql实现solr 7基本使用(安装、集成中文分词器、定时同步数据库数据以及项目集成)
- 分布式缓存技术redis学习系列(五)——spring-data-redis与JedisPool的区别、使用ShardedJedisPool与spring集成的实现及一致性哈希分析
- 【系列3】使用Dockerfile创建带编译安装nginx服务的Centos Docker镜像
- docker系列-06.docker搭建ELK,集成filebeat客户端配置使用(二)
- 分布式缓存技术redis学习系列(五)——spring-data-redis与JedisPool的区别、使用ShardedJedisPool与spring集成的实现及一致性哈希分析
- freeswitch系列二 kamailio 5.0安装及实现kamailio集成freeswitch
- SpringBoot系列十一:SpringBoot整合Restful架构(使用 RestTemplate 模版实现 Rest 服务调用、Swagger 集成、动态修改日志级别)
- Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问
- vba使用win32 API(GetOpenFileName )实现打开文件对话框
- vba使用win32 API(GetOpenFileName )实现打开文件对话框
- vba使用win32 API(GetOpenFileName )实现打开文件对话框
- vba使用win32 API(GetOpenFileName )实现打开文件对话框
- 如何安装并使用Windows Symbol File
- vba使用win32 API(GetOpenFileName )实现打开文件对话框
- 下载和在VS.NET 2003安装IEWebControls组件实现TreeView控件使用
- 【经验分享】QT的安装使用,与VC的集成