王宁凯的个人博客

Vagrant 友好的开发环境

2019.06.15

Vagrant

Vagrant也是一款开源免费的工具,用于管理虚拟机。详细的介绍到 官方文档 查看。一种可以自动化虚拟机的安装和配置流程软件。

简介

作为开发人员,部署的应用一般都是放在 linux 环境执行,但是不管是用Windows 还是 MacOS,即使本地程序运行十分流畅,但也会时不时出现上线 Bug 如山的情况,那么最好的方式就是将本地开发环境部署得和线上一致。否则环境的查错和调试的时间将大大影响开发进度。

因此,最好的解决方案就是让本地环境与线上一致。线上服务器大多数公司是用Linux 系统,免费强大,为了保证环境一致,选用虚拟机搭建一个 Linux 系统是最合适的方式。

Vagrant 可以方便的管理虚拟机,如 VMwareVirtualbox等虚拟化软件 ,一键下载你想要的操作系统,并可以轻松将系统进行打包分享,就可以大大减轻的部署环境的工作。

Vagrant 带来的好处

如果你是一位 开发者 , Vagrant 可以为你创建一个将所有依赖及配置隔离、便携统一的虚拟开发环境,因此你可以继续使用已经习惯了的开发工具(比如 编辑器、浏览器、调试器等)进行工作,编写的代码则运行在 Vagrant 创建的统一虚拟开发环境下。 当你或其他人创建了一个 Vagrantfile 配置文件 后, 只需要输入 vagrant up 命令便可自动安装及配置,你便可以进行开发工作了。团队其他成员使用相同的 Vagrantfile 配置文件创建自己的开发环境后,则所有成员都具有相同的代码运行环境,所以无论你工作在 Linux、Mac OS X 还是 Windows 下,你团队所有成员的代码都运行在拥有相同依赖及配置的统一虚拟环境里。跟 “在我的机器上运行没事” 说再见吧,再也不会出现因环境不同而出现 bug 的情况了。

如果你是一位 运维工程师 , Vagrant 为你提供了一个便携环境和统一的流程,来对运维脚本进行开发及测试。 你可以快速地测试 shell 脚本、 Chef cookbooks、 Puppet 模块, 以及使用本地虚拟化,例如 VirtualBox 或 VMware。此外, 你还可以在远程的云端,例如 AWS 或 RackSpace 上使用 相同的配置和相同的流程。例如,使用你的自定义脚本来回收 EC2 实例, stop juggling SSH prompts to various machines, 使用 Vagrant 将使你的人生更加智能。

如果你是 设计师 , Vagrant 将自动设置好一切 Web App 开发所需环境,可以使你只专注于你擅长的设计工作。 当开发者配置好了 Vagrant, 你无需担心如何使你的 App 能够在新的环境中运行起来,也不用再麻烦开发人员为你配置开发环境, 你只需要输入命令 , vagrant up , 便可开始设计工作.

文档

官方文档 中文文档

使用

由于 Vagrant 只是一个虚拟机管理和配置工具,安装后还不能直接使用,还需要专门的虚拟化软件操作虚拟机系统的安装和运行。

Vagrant 默认已经内置了 VirtualBox Provider 用来跟 VirtualBox 交互,所以再去 VirtualBox 官网下载并安装 VirtualBox 就可以正式开始使用了。

Vagrant 默认是与 Virtualbox 组合使用,在使用之前,准备一下工具:

Vagrant 官方提供了很好的 Getting Started,按照这个文档一步步操作就可以学会怎么用它了。

$ vagrant init hashicorp/precise32
$ vagrant up

在执行以上两条命令后, 你将拥有一台运行在 VirtualBox 下的 Ubuntu 12.04 LTS 32位 虚拟机。你可以通过 vagrant ssh 命令来 SSH 登录到这台虚拟机上,当你用完以后,可以通过 vagrant destroy 命令来销毁所有的使用痕迹。

现在可以想像一下,你曾经的项目都可以像现在这样简单快速地创建并开始工作。

使用 Vagrant, 你只需要执行 vagrant up 命令,Vagrant 会自动安装该项目所有环境依赖,设置好网络及共享目录,因此你可以舒舒服服地在你自己的虚拟机上进行工作。

Vagrant的搭建过程极其简单,虚拟机的网络通了,与物理主机也能共享目录,而且还能进行端口转发,这些功能如果是自己手把手在virtualBox搭建,要耗费不少时间。Vagrant 解放了我们的时间,但 Vagrant的功能肯定不只是这么简单,可以仔细查看官方文档。

Vagrant 虚拟机基本命令

命令作用
vagrant up启动本地环境
vagrant halt关闭本地环境
vagrant suspend暂停本地环境
vagrant resume恢复本地环境
vagrant reload修改了 Vagrantfile 后,使之生效(相当于先 halt,再 up)
vagrant ssh通过 ssh 登录本地环境所在虚拟机
vagrant destroy彻底移除本地环境

实际使用过程中,通过 vagrant suspend/resume 来快速暂停 / 恢复最为方便。

Vagrant 常用命令

前面讲了Vagrant的几个命令:

  • vagrant box add 添加box的操作
  • vagrant init 初始化box的操作
  • vagrant up 启动虚拟机的操作
  • vagrant ssh 登录虚拟机的操作

Vagrant还包括如下一些操作:

  • vagrant box list

    显示当前已经添加的box列表

      $ vagrant box list
      base (virtualbox)
    
  • vagrant box remove

    删除相应的box

      $ vagrant box remove base virtualbox
      Removing box 'base' with provider 'virtualbox'...
    
  • vagrant destroy

    停止当前正在运行的虚拟机并销毁所有创建的资源

      $ vagrant destroy
      Are you sure you want to destroy the 'default' VM? [y/N] y
      [default] Destroying VM and associated drives...
    
  • vagrant halt

    关机

      $ vagrant halt
      [default] Attempting graceful shutdown of VM...
    
  • vagrant package

    打包命令,可以把当前的运行的虚拟机环境进行打包

      $ vagrant package
      [default] Attempting graceful shutdown of VM...
      [default] Clearing any previously set forwarded ports...
      [default] Creating temporary directory for export...
      [default] Exporting VM...
      [default] Compressing package to: /Users/astaxie/vagrant/package.box
    
  • vagrant plugin

    用于安装卸载插件

  • vagrant provision

    通常情况下Box只做最基本的设置,而不是设置好所有的环境,因此Vagrant通常使用Chef或者Puppet来做进一步的环境搭建。那么Chef或者Puppet称为provisioning,而该命令就是指定开启相应的provisioning。按照Vagrant作者的说法,所谓的provisioning就是"The problem of installing software on a booted system"的意思。除了Chef和Puppet这些主流的配置管理工具之外,我们还可以使用Shell来编写安装脚本。

    例如: vagrant provision --provision-with chef

  • vagrant reload

    重新启动虚拟机,主要用于重新载入配置文件

      $ vagrant reload
      [default] Attempting graceful shutdown of VM...
      [default] Setting the name of the VM...
      [default] Clearing any previously set forwarded ports...
      [default] Creating shared folders metadata...
      [default] Clearing any previously set network interfaces...
      [default] Preparing network interfaces based on configuration...
      [default] Forwarding ports...
      [default] -- 22 => 2222 (adapter 1)
      [default] Booting VM...
      [default] Waiting for VM to boot. This can take a few minutes.
      [default] VM booted and ready for use!
      [default] Setting hostname...
      [default] Mounting shared folders...
      [default] -- /vagrant
    
  • vagrant resume

    恢复前面被挂起的状态

      $vagrant resume
      [default] Resuming suspended VM...
      [default] Booting VM...
      [default] Waiting for VM to boot. This can take a few minutes.
      [default] VM booted and ready for use!
    
  • vagrant ssh-config

    输出用于ssh连接的一些信息

      $vagrant ssh-config
      Host default
        HostName 127.0.0.1
        User vagrant
        Port 2222
        UserKnownHostsFile /dev/null
        StrictHostKeyChecking no
        PasswordAuthentication no
        IdentityFile "/Users/astaxie/.vagrant.d/insecure_private_key"
        IdentitiesOnly yes
        LogLevel FATAL
    
  • vagrant status

    获取当前虚拟机的状态

      $vagrant status
      Current machine states:
    
      default                   running (virtualbox)
    
      The VM is running. To stop this VM, you can run `vagrant halt` to
      shut it down forcefully, or you can run `vagrant suspend` to simply
      suspend the virtual machine. In either case, to restart it again,
      simply run `vagrant up`.
    
  • vagrant suspend

    挂起当前的虚拟机

      $ vagrant suspend
      [default] Saving VM state and suspending execution...