zoukankan      html  css  js  c++  java
  • [转] 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系列二:vagrant的配置文件vagrantfile详解

  • 相关阅读:
    关闭窗体后,利用StreamWriter保存控件里面的数据
    ref传递
    C# 特性 Attribute
    关键字 new 的作用
    关键字 base 的作用
    关键字 this 的作用
    random类的使用
    数据库结果为 基于左右值排序的无限分类算法
    PHP显示日期、周几、农历初几、什么节日函数编程代码
    描述了say_hello函数的具体内容,调用zend_printf系统函数在php中打印字符串
  • 原文地址:https://www.cnblogs.com/pekkle/p/9518493.html
Copyright © 2011-2022 走看看