zoukankan      html  css  js  c++  java
  • Vagrant入门2

     

    复制于 https://www.cnblogs.com/davenkin/p/vagrant-virtualbox.html

    简单地说,Vagrant让我们可以通过代码的方式快速地、可重复地创建针对不同虚拟环境的虚拟机,包括Virtualbox、AWS、Docker等。它使得我们可以一次性地、自动创建多个环境相同的虚拟机,对于软件开发和测试尤其有用。本文我们将以Virtualbox为例,看看Vagrant的基本使用。

    这是一个关于Vagrant的学习系列,包含如下文章:

    1. Vagrant入门
    2. 创建自己的Vagrant box 
    3. 用Vagrant搭建Jenkins构建环境
    4. 用Vagrant和Ansible搭建持续交付平台

    (一)快速入门

    首先需要创建一个目录用于存放Vagrantfile文件以及Vagrant在工作中的数据:

    mkdir my-vagrant-project
    cd my-vagrant-project

    然后初始化Vagrant工程:

    1.不指定box名的初始化

    vagrant init

    vagrant init 命令会在当前目录下创建vagrantfile文件。在未指定box的情况下,默认box名为base,生成的vagrantfile如下(注释太长,这里省去)

    Vagrant.configure("2") do |config|
    
      config.vm.box = "base"
    
    end

    2.指定box名的初始化,初始化生成的vagrantfile文件会将box设置为指定box。

    vagrant init ubuntu/trusty64

    该命令会在当前目录下创建Vagrantfile,并且指定所使用的box为ubuntu/trusty64。

    该box由Hashicorp官网提供。此时,Vagrant发现box的名字的格式为“用户名/box名”,在vagrant up执行时,则会使用“https://atlas.hashicorp.com/用户名/box名”来下载该box。

    生成的vagrantfile文件内容如下(注释已省去)

    Vagrant.configure("2") do |config|
    
      config.vm.box = "ubuntu/trusty64"
    
    end

    3.指定box名并同时指定下载地址的初始化。如下

    vagrant init my-box https://app.vagrantup.com/centos/boxes/7/versions/1804.02/providers/virtualbox.box

    其中,my-box为该box的名字,后面的URL为该box的下载地址。vagrantfile文件内容如下。

    Vagrant.configure("2") do |config|

      config.vm.box = "my-box"

      config.vm.box_url = "https://app.vagrantup.com/centos/boxes/7/versions/1804.02/providers/virtualbox.box"

    end

    config.vm.box的作用就是指定在vagrant up时要挂载的box

    config.vm.box_url的作用就是在本地找不到config.vm.box指定的box时,从该url下载box到本地,并将该box文件命名为config.vm.box指定的名称

    通过以上的初始化命令目的就是生成vagrantfile文件,在初始化的时候可以使用参数对vagrantfile进行初步的设置,如制定box名等等。

    在生成vagrantfile文件后,可以编辑vagrantfile文件进行更见详细的设置。如何设置后面会讲解

    vagrant up启动虚拟机:

    vagrant up

    此时Vagrant会先从Hashicorp下载ubuntu/trusty64这个box(如果先前下载过了则跳过),然后启动虚拟机。

    在默认情况下,Virtualbox将作为provider,当然你也可以使用其他provider,比如以下命令将启动一个hyperv虚拟机:

    vagrant up --provider hyperv

    重启虚拟机

    vagrant reload

    在修改了vagrantfile文件后,可通过vagrant reload来重新启动虚拟机

    登录到虚拟机:

    vagrant ssh

    此时vagrant将使用默认的用户vagrant以及预设的SSH公钥密钥键值对直接登录虚拟机。

    关闭虚拟机:

    vagrant halt

    删除虚拟机:

    vagrant destroy

    请注意,vagrant destroy只会删除虚拟机本身,也即你在Virtualbox将看不到该虚拟机,但是不会删除该虚拟机所使用的box。

    Vagrant还会在Vagrantfile所在同级目录下创建一个.vagrant隐藏文件夹,该文件夹包含了在本地运行虚拟机的一些信息。如果使用了代码库管理(比如Git),这个.vagrant文件夹应该被ignore掉

    (二)添加和查看所下载的box

    查看本地box

     Vagrant会将所下载的box保存到~/.vagrant.d/boxes目录下,使用以下命令查看本地的所有box

    vagrant box list

    删除某个box:

    vagrant box remove box-name

    下载box有两种方式

    一种时使用vagrant add 命令单独下载box到本地

    另一种就是在vagrantfile文件中设置 config.vm.box  和 config.vm.box_url,这样在vagrant up启动虚拟机的时候根据情况下载box

    从Hashicorp官网上下载ubuntu/trusty64这个box

    vagrant box add ubuntu/trusty64

    指定一个URL下载box

    vagrant box add --name mybox http://someurl.com/ubuntu.box

    这里的mybox是一个逻辑名字,就是给所下载的box所起的名字,下载的box文件就是以此名为文件名保存在~/.vagrant.d/boxes目录下。该名字用来设置Vangrantfile的“config.vm.box”。

    你可以在任何时候向Vagrant中添加新的box以备后用,

    在执行vagrant up时,Vagrant首先检查本地是有存在Vangrantfile的“config.vm.box”所指定的box,如果有则直接使用,如果没有则下载。

    (三)端口转发(Port Forwarding)

    在默认情况下,Vagrant所创建的Virtualbox虚拟机使用的是NAT网络类型,即外界是不能直接访问你的虚拟机的,就连Host机器也访问不了。此时,如果你在虚拟机中启动的一个Tomcat来部署网站的测试环境,而又想外界能够访问的话,你需要使用端口转发:

    Vagrant.configure("2") do |config|
      config.vm.network "forwarded_port", guest: 8080, host: 8888
    end

    以上代码将Host机的8888端口转发到了虚拟机的8080端口,这样你便可以通过在Host机上访问http://localhost:8888来访问虚拟机的Tomcat了。对于Virtualbox来说,只有NAT类型的网络类型支持端口转发,这也是为什么Vagrant创建的Virtualbox虚拟机默认都有一个支持NAT的虚拟网卡,原因就是要能够支持Vagrant级别的端口转发。另外,Vagrant在第一次尝试连接虚拟机时使用的也是NAT。

    (四)共享文件夹

    在默认情况下,Vagrant所创建的虚拟机已经为我们创建了一个共享文件夹,在虚拟机上是/home/vagrant目录,在Host机上则为Vagrantfile所在目录,当然你也可以额外添加另外的共享文件夹:

    Vagrant.configure("2") do |config|
      config.vm.synced_folder "src/", "/srv/website"
    end

    第一个参数为Host机器上的目录,第二个参数为虚拟机上的目录。

    可以设置多个共享文件,如下

    Vagrant.configure("2") do |config|
      config.vm.synced_folder "./", "/var/www/pyxis2", owner: "vagrant", groupe: "vagrant", mount_options: ["dmode=777", "fmode=777"]
      config.vm.synced_folder "../p2tasks", "/var/www/p2tasks", owner: "vagrant", groupe: "vagrant", mount_options: ["dmode=777", "fmode=777"]
    end

     (五)Provision

    简单地说,Provision即通过使用某些工具自动地、批量地为机器安装软件以及配置系统,它省去了人工安装和配置系统时的重复性和易错性,当然还享受了计算机与生俱来的速度。Vagrant提供多种方式对虚拟机进行Provision,包括Shell、Chef、Puppet和Ansible等。以Shell为例,既可以通过直接在Vagrantfile中编写Shell脚本的方式,也可以通过引用外部Shell文件的方式。

    直接在Vagrantfile中编写Shell脚本,可以通过“inline”指定脚本内容:

    单行:

    Vagrant.configure("2") do |config|
      # ... other configuration
    
      config.vm.provision "shell", inline: "echo hello"
    end

    多行:

    config.vm.provision "shell", inline: <<-SHELL
       apt-get update
       apt-get install -y apache2
    SHELL

     通过引用外部脚本文件的方式:

    Vagrant.configure("2") do |config|
      config.vm.provision "shell", path: "script.sh"
    end

    在使用Ansible时,有两种方式:(1)在Host机器上安装Ansible,(2)采用Ansible Local的方式,即在虚拟机自身上安装Ansible。对于第(1)种方法,我们需要保证Host机器上已经安装了Ansible,然后进行配置:

    复制代码
    Vagrant.configure("2") do |config|
    
      #
      # Run Ansible from the Vagrant Host
      #
      config.vm.provision "ansible" do |ansible|
        ansible.playbook = "playbook.yml"
      end
    
    end
    复制代码

    在使用第(2)种方法时,Vagrant会首先检查box中是否已经安装了Ansible,如果没有,则会自动安装到虚拟机上,然后再运行provision:

    复制代码
    Vagrant.configure("2") do |config|
      # Run Ansible from the Vagrant VM
      config.vm.provision "ansible_local" do |ansible|
        ansible.playbook = "playbook.yml"
      end
    end
    复制代码

    当我们多次执行“vagrant up”启动虚拟机时,provison并不会每次都执行,只有在这三种情况下provision才会运行:

    1. 首次执行vagrant up
    2. 执行vagrant provision
    3. 执行vagrant reload --provision

    当然,你也可以在Vagrantfile中配置成每次执行vagrant up时都运行provision:

    Vagrant.configure("2") do |config|
      config.vm.provision "shell", inline: "echo hello",
        run: "always"
    end

    (六)网络配置

    在默认情况下,对于Virtualbox而言,Vagrant将使用Virtualbox的NAT网络方式,这种方式允许虚拟机访问外部网络,但是不允许外界访问虚拟机,就连Host机器也访问不了。

    另外,我们可以为虚拟机配置private networkpublic network

    在配置private network时,相当于虚拟机和Host机共同组成了一个单独的局域网,外界无法访问该局域网,但是虚拟机可以访问外界,Host机和虚拟机之间也可以互访。请注意,这里说的外界是指原本和Host处于同一局域网的其他机器。

    使用private network时,我们可以给虚拟机指定固定的私有IP:

    Vagrant.configure("2") do |config|
      config.vm.network "private_network", ip: "192.168.50.4"
    end

    当然也可以使用DHCP的方式动态分配IP:

    Vagrant.configure("2") do |config|
      config.vm.network "private_network", type: "dhcp"
    end

    对于Virtualbox而言,此时虚拟机其实有两张网卡在工作,一种是Vagrant默认创建的NAT网卡,另一种是Host only类型的网卡提供private network。

    在使用public network时,虚拟机和Host在网络中具有同等的地位(共同使用Host机的物理网卡与外界通信),就相当于在Host所在网络中又多了一台计算机一样,此时虚拟机可以使用网络中的DHCP服务器获得与Host处于同一个网段的IP地址,以下配置默认采用DHCP方式配置public network:

    Vagrant.configure("2") do |config|
      config.vm.network "public_network"
    end

    如果Host机器有多张网卡,此时运行vagrant up, Vagrant会询问需要使用那张网卡连接到网络,如果不想要这种交互,则可以在Vagrantfile中进行配置:

    config.vm.network "public_network", bridge: [
      "en1: Wi-Fi (AirPort)",
    ]

    这里的 Wi-Fi(AirPort)表示使用了Mac笔记本的Airport连接到Wi-Fi。

    除了DHCP,也可以使用静态IP:

    Vagrant.configure("2") do |config|
      config.vm.network "public_network", ip: "192.168.0.5"
    end

    (七)Provider特定配置

    不同的Provider有不同的特性,也存在不同的配置方式。以Virtualbox为例,Vagrant默认会给虚拟机指定一个不具备可读性的名字,比如my-vagrant-project_default_1471685053487_94837,我们可以对此进行配置予以更改:

    config.vm.provider "virtualbox" do |v|
      v.name = "my_vm"
    end

    Provider的特定配置也可以覆盖Vagrant原来的配置:

    复制代码
    Vagrant.configure("2") do |config|
      config.vm.box = "precise64"
    
      config.vm.provider "vmware_fusion" do |v, override|
        override.vm.box = "precise64_fusion"
      end
    end
    复制代码

     在下一篇中,我们将讲到如何创建自己的Vagrant box 

  • 相关阅读:
    创建用户自定义函数 SQL
    sql with as 用法
    将string转为同名类名,方法名。(c#反射)
    linq 实现对象映射
    sql 游标
    C#编程总结(六)异步编程
    线程加锁解锁,用于循环条件不确定大小
    滚动条随代码滚动
    C# 代码小技巧
    reload方法
  • 原文地址:https://www.cnblogs.com/gaoBlog/p/10942048.html
Copyright © 2011-2022 走看看