部署 学习 Vagrant

xiajian · 2015年05月19日 · 5158 次阅读

前言

最早的时候,是在某学弟的说说中看到 vagrant。github 上搜了一下,发现 star 数还挺多的。随后的岁月里,常常能看到这个名词,今天研究一下。

不知道这到底属于那个节点,姑且归类为部署吧。

vagrant 是什么

Vagrant 提供了基于企业级标准技术的易配置、可重复、可移植的工作环境,从而最大化团队的生产力和灵活性。

Vagrant 可构建在由 VirtualBox,VMware,AWS 以及其他提供商提供的机器上,并且可以使用 shell 脚本,Chef,Puppet 等配置管理工具。

vagrant 的特点:

  • 将配置和依赖隔离在一次性和一致性的环境中
  • 使用简单,只需Vagrantfilevagrant up,适用人群广 (开发者,运维人员,设计师)

vagrant 其实就是封装了的 Virtualbox 的 API 的 ruby DSL,抽象和简化了某些操作,用一个命令以及配置文件,而不是一堆命令去管理和使用 vm。

安装

先决条件: 安装virtualbox - 安装的 virtualbox 版本为4.3.20r96996(vboxmanage -v)。

安装使用 installer,用 RubyGems 安装问题多多,依赖巨复杂,vagrant 安装的版本是 1.7.2 (vagrant version)

注: 哪天,小爷我不开心了,要将 vagrant 删掉,只要删除/opt/vagrant目录和/usr/bin/vagrant文件。用户数据存放在~/.vagrant.d中,下次重装可直接复用。

使用

起步

按如下的命令列表,即可启动进入一个虚拟机中:

mkdir test && cd test
vagrant box add base http://files.vagrantup.com/lucid32.box  # 这里的模式是 vagrant box add {title} {url}
vagrant init base # 初始化一个box为base的Vagrantfile,默认box就是base
vagrant up        # 启动虚拟机
vagrant ssh       # ssh到虚拟机环境中

boxes

vagrant 强大之处,在于使用镜像 (image) 快速创建 (克隆) 虚拟机。vagrant 中将镜像称作 box,创建Vagrantfile之后,最重要的就是指定环境所用的 box。

box 的子命令如下:

  • add - 添加新的 box
  • list - 列出所有的 box
  • outdated - 检查是否最新
  • remove - 删除 box
  • repackage - 重新打包 box
  • update - 更新特定 box

一些镜像 (box) 的地址是:

若是从http://www.vagrantbox.es/直接下载镜像,则需要运行如下的命令:

mkdir test2 && cd test2
wget https://github.com/jose-lpa/packer-ubuntu_14.04/releases/download/v2.0/ubuntu-14.04.box
vagrant init ubuntu-14.04.box  # ubuntu-14.04.box为已下载的某镜像文件
vagrant up
vagrant ssh

备注: 起初看到启动 vm 时,可以通过 ssh 进行连接的,尝试ssh [email protected]:2200 ,一直 timeout。看了官方文档后,才知道原来使用vagrant ssh命令。

注意: 不要在虚拟机中运行rm -rf /,因为虚拟机与宿主机器存在共享目录/vagrant

同步目录

同步目录: 貌似和共享文件夹又有所不同,vagrant 会自动 sync 文件,所以,这句话表示存在两个文件还是一个文件。不过,同步和共享肯定是不同的。

自动配置

Vagrant 内建了对自动配置的支持,其可以在vagrant up时,自动安装软件。从而使其客机虚拟机可以重复创建且随时可用。

举个例子,比如安装 apache:

  1. 首先,在 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
  1. 然后,在 Vagrantfile 写入如下的配置: config.vm.provision :shell, path: "bootstrap.sh"

或者直接写在 Vagrantfile 文件中:

config.vm.provision "shell", inline: <<-SHELL
  sudo apt-get update
  sudo apt-get install -y apache2
  if ! [ -L /var/www ]; then
    rm -rf /var/www
    ln -fs /vagrant /var/www
  fi
SHELL

网络

网络主要就是端口映射和内网 IP 的设置,端口映射的配置为:

config.vm.network :forwarded_port, host: 4567, guest: 80

共享

共享分发开发环境,需要一个免费的 HashiCorp's Atlas 帐号。使用命令如下:

vagrant login
vagrant share

注: 感觉 vagrant 所做的,其实和 docker hub 很相似,都是基于 image 的仓库。

Providers

Vagrant 支持很多不同后端 vm 后端,除了 VirtualBox,还有 VMware, AWS, Docker 等。这些 provider 本身,可以无缝切换。

命令行接口

vagrant 提供了丰富操作的命令,其中,常用的一些如下:

vagrant up       # 启动虚拟机,会执行相应的自动配置
vagrant halt     # 关机
vagrant reload   # 重新启动,主要用于重新载入配置文件
vagrant suspend  # 挂起当前虚拟机
vagrant resume   # 恢复被挂起的vm
vagrant box list # 列出所有box列表
vagrant box remove {basename}
vagrant destroy  # 停止当前正在运行的虚拟机并销毁所有创建的资源
vagrant package  # 把当前的运行的虚拟机环境进行打包,可用于分发开发环境
vagrant plugin   # 安装卸载插件 
vagrant provision  # 设置基本的环境,进一步设置可以使用Chef/Puppet进行搭建
vagrant ssh-config # 输出ssh连接的一些信息
vagrant status     # 获取虚拟机状态
vagrant version    # 获取vagrant的版本

除了上面的那些命令,还有 login 、rdp 、 share 、global-status 等等,详细参考 vagrant -h

剩下的大部分需要的学习的部分都在了解如何配置 Vagrantfile 文件。

vagrant 的用处: 单机模拟多台机器,从而测试分布式的集群环境。Vagrantfile 中可以定义 vm 的角色,也可vagrant ssh {role-name}到特定的机器上去。

vagrant 的相关配置

vagrantfile 相关的配置涉及 vm 、 ssh 、 winrm 、vagrant、 box 、network、同步目录,多机器配置,虚拟技术提供方,插件 (似乎提供不少插件) 以及推送 (Push)。

简单的配置介绍如下:

config.vm.box = "base"      # vm的box的基,默认为base
config.vm.customize ["modifyvm", :id, "--name", "gogojimmy", "--memory", "512"]  # 配置vm的各种参数
config.vm.host_name = "xxx" # 配置主机名,很重要的标识
config.vm.network           # 两种桥接方式,私有和公共          

同步目录: 貌似和共享文件夹又有所不同,vagrant 会自动 sync 文件,所以,这句话表示存在两个文件还是一个文件。

最为强大的是多虚拟机的系统设置,只需在同一Vagrantfile中定义不同的用户角色即可:

config.vm.define :app do |app_config|
  app_config.vm.host_name = "app"
  app_config.vm.network "private_network", ip: "33.33.13.10"
end

config.vm.define :db do |db_config|
  db_config.vm.host_name = "db"
  db_config.vm.network "private_network", ip: "33.33.13.11"
  db_config.vm.provider "virtualbox" do |vb|
    vb.memory = "512"
  end
end

config.vm.define :cache do |cache_config|
  cache_config.vm.host_name = "cache"
  cache_config.vm.network "private_network", ip: "33.33.13.12"
end

通过上面的配置,然后运行vagrant up,分分钟就可以启动 3 台虚拟机了。具体输出如下:

Bringing machine 'app' up with 'virtualbox' provider...
Bringing machine 'db' up with 'virtualbox' provider...
Bringing machine 'cache' up with 'virtualbox' provider...
==> app: Clearing any previously set forwarded ports...
==> app: Fixed port collision for 22 => 2222. Now on port 2200.
==> app: Clearing any previously set network interfaces...
==> app: Preparing network interfaces based on configuration...
    app: Adapter 1: nat
    app: Adapter 2: hostonly
==> app: Forwarding ports...
    app: 22 => 2200 (adapter 1)
==> app: Booting VM...
==> app: Waiting for machine to boot. This may take a few minutes...
    app: SSH address: 127.0.0.1:2200
    app: SSH username: vagrant
    app: SSH auth method: private key
    app: Warning: Connection timeout. Retrying...
==> app: Machine booted and ready!
==> app: Checking for guest additions in VM...
    app: The guest additions on this VM do not match the installed version of
    app: VirtualBox! In most cases this is fine, but in rare cases it can
    app: prevent things such as shared folders from working properly. If you see
    app: shared folder errors, please make sure the guest additions within the
    app: virtual machine match the version of VirtualBox you have installed on
    app: your host and reload your VM.
    app: 
    app: Guest Additions Version: 4.2.0
    app: VirtualBox Version: 4.3
==> app: Setting hostname...
==> app: Configuring and enabling network interfaces...
==> app: Mounting shared folders...
    app: /vagrant => /home/xiajian/works/test/vargant
==> app: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> app: to force provisioning. Provisioners marked to run always will still run.
  。。省略DB和Cache的启动。。。

备注: 不同版本的 vagrant 之间的配置可能有所区别,具体的以当前生成的 Vagrantfile 中配置描述的为准。 vagrant reload只能对已有的虚拟机进行配置的重新载入,对于未创建的虚拟机则不作处理。所以,虚拟机的启动, 主要还是靠vagrant up命令。

此外,virtualbox 仅仅是 vagrant 的一个虚拟机提供商,Docker 和 VMWare 也是 vagrant 的 provider。

vagrant 文档提供了翔实的信息,更多可参考https://docs.vagrantup.com/v2/

virtualbox

虚拟化的好处:

  • 可同时运行多个操作系统
  • 软件安装更容易 - 将复杂的步骤打包到虚拟机中
  • 测试和容灾恢复 - 快照功能、保存虚拟机特定状态,云主机有自动打快照的功能
  • 基础设施的整合 - 充分利用物理机器的性能

术语: Host OS(宿主 os), Guest OS(支持任何 X86 的系统), 虚拟机 (VirtualBox 为 Guest OS 创建的特定环境,VirtualBox 默认将虚拟机看作一组参数 - 决定了虚拟机的行为), 客机增强件 (安装在虚拟机中,提高客机性能和额外的功能支持)

Virtualbox 的功能概览:

  • 可移植性,2 类虚拟机管理程序,相对直接运行在裸机上虚拟机 (一类 vm mangement)。开放虚拟化格式 OVF。
  • 硬件虚拟化不是必备条件 - 处理器可支持虚拟化技术
  • 客机增强套件: 共享文件夹,无缝窗口,3D 虚拟化。
  • 硬件支持: SMP,USB, 硬件兼容性,PXE 等
  • 多代可分支快照
  • 架构整洁、结构模块化,存在 SDK 接口 - vagrant 所依赖的
  • 远程桌面显示: VRDE 之类

VirtualBox 提供了不少命令行工具:

  1. VBox
  2. VBoxAutostart
  3. VBoxBalloonCtrl
  4. VBoxHeadless
  5. VBoxManage 是 Virtualbox 的命令行接口,其支持比图形界面更多的功能,可展现虚拟引擎的所有功能。
  6. VBoxSDL
  7. VBoxTunctl
  8. VBoxVRDP

备注: 上面的这些命令也存在小写字母版的,果然,要大写什么的,太不方便了。

需要编译并加载 vboxdrv 内核模块,VirtualBox 应用程序通过 Unix 本地套接字与后台程序通信。

两种镜像文件: 动态扩展的镜像文件、固定大小镜像文件。

更多相关技术,可以参考 VirtualBox 提供的相关的文档: https://www.virtualbox.org/wiki/Documentation

虚拟化相关的技术: XEN, KVM(OpenStack 利用),Hypervisor,基于 LXC 的 Docker。虚拟化的技术,需要对 OS 的理解加深。

后记

原本是为了装 qq,才去装 virtualbox 和 XP 的镜像系统,结果用了一段时间后,发现体验和感觉都相当的不错。这让我意识到虚拟环境的有用和高效之处。

阅读了一下 Virtualbox 的文档之后,发现 Virtualbox 有提供 API 和 SDK 的接口。这样就很好理解 vagrant 的开发的基础。此外,偶然发现,vagrant 的作者在 11 年的时候,曾开发过一个virtualbox的 gem。 此外,Virtualbox 本身以依赖其他的一些 GNU 的虚拟机的代码,比如 bochs。

参考文献

  1. vagrant 使用小结
  2. Vagrant 小结
  3. Vagrant 官方
  4. VirtualBox 用户手册
  5. Vgrant 使用入门
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号