使用Vagrant将您的笔记本电脑刻录到虚拟机

使用Vagrant将您的笔记本电脑刻录到虚拟机

(原标题:Carve Your Laptop Into VMs Using Vagrant,事实上这篇文章讲述的是在你的笔记本你电脑上使用Vagrant创建虚拟机,译者注)

如果您是开发人员或DevOps工程师,则很有可能您已经使用Vagrant - 一种可用于在笔记本电脑或台式机上创建虚拟机的个人虚拟化管理工具。通常,这意味着Windows或Mac笔记本电脑上的Linux虚拟机。

Vagrant实际上是一个管理个人计算机上虚拟机生命周期的应用程序。在底层,它需要一个虚拟机管理程序来创建和运行一个虚拟机,最经常的应用程序是VirtualBox,因为它不需要许可证(即Virtual Box是免费开源的,译者注)。同时它还支持Hyper-V和VMWare。

安装

您可以在个人计算机(虚拟化术语中所称的主机)上安装VirtualBox和Vagrant。您在计算机上创建的虚拟机被称作客户机(Guest Machine)。

下载适用于您的机器操作系统(Windows,OS-X等)以及平台和体系结构(Intel x86,AMD64等)的VirtualBox镜像。选择默认设置安装。

下载适配于您的适配于您的目标操作系统的Vagrant并安装,再次选择默认设置进行安装。

经过上面的准备,您已经准备您的第一个虚拟机并安装了SSH。

创建一个Ubuntu虚拟机

在Windows上启动命令提示符或在Mac上启动终端,运行以下命令来启动Ubuntu虚拟机。

  • cd到一个你想保留Vagrant的地方。如果需要,创建一个新的。(cd即终端中改变当前目录的命令,译者注)
  • vagrant init hashicorp/precise64
  • vagrant up

后台会进行一系列复杂的操作(我们感觉很快就会完成),但您只需要在本地机器上启动Ubuntu虚拟主机即可。

登录到客户机

在对UNIX友好的Mac上,通过SSH登陆到客户机非常简单:只需使用以下Vagrant命令:

$ vagrant ssh

在Windows上,这是相当困难的,因为它没有本地SSH客户端。当一个客户机被创建时,用户vagrant以及它的公共密钥会被添加到客户机上。该用户的专用密钥在主机上可用,公用密钥的路径和SSHD在客户机上运行的端口(SSH客户机应连接的端口)可以使用命令“vagrant ssh-config ”来查询。

$ vagrant ssh-config

Host HOST
  HostName 127.0.0.1
  User vagrant
  Port 2222
  IdentityFile /Users/USERNAME/vagrant/.vagrant/machines/HOST/virtualbox/private_key

获取这些信息后您可以用像PuTTY这样的SSH客户端访问客户机。

命令背后的操作

如果你的需求只是创建一个Ubuntu主机并且用它做点什么,那么你就不需要知道当init和up这样的命令在运行时会发生什么。但是,如果您想将Vagrant用作开发和自动化环境,则不仅需要了解上述简单的配置步骤,还要制定出基于Vagrant的解决方案。

所有使用Vagrant配置虚拟机的配置都存储在Vagrantfile中。尽管此文件的名称和位置是可配置的,但通常位于运行Vagrant命令的当前目录中。

作为示例,Vagrant init命令会生成类似于以下的Vagrantfile,该文件用于在最后一个示例中提供Ubuntu VM:

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.vm.box = "hashicorp/precise64"
end

尽管Vagrantfile的默认版本内容很长,但大部分内容都被解释为支持的选项。上面看到是激活的配置设置。

配置客户机

VirtualBox的安装是在笔记本电脑/台式机上的一次性安装。之后,您可以在Vagrantfile中配置所需的机器,并且可以启动这些机器。

重要的是找到一个合适的基础镜像来构建你的客户机,主要是提供的操作系统风格。基础镜像被称为“盒子”,由配置项目config.vm.box指定。box“hashicorp / precise64”安装了Ubuntu 64位体系结构的一个版本。可以使用其他操作系统的盒子的示例如下:

  • Ubuntu/ trusty64
  • centos/7

客户机一经启动,就可以使用各种配置方法进行进一步配置,例如内嵌shell命令,以及本地脚本和通过URL访问的脚本。例如,通过在Vagrantfile中添加以下部分,一个本地脚本就可以作为一个配置步骤被运行:

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

在DevOps驱动的环境中,虚拟机由一些配置管理(CM)工具(如Ansible)提供。Vagrant也支持这个功能。例如,Ansible playbook playbook.yml可以针对新创建的客户机运行,方法是将其指定为Vagrantfile的配置者:

Vagrant.configure(2) do |config|
   config.vm.provision "ansible" do |ansible|
      ansible.playbook = "playbook.yml"
   end
end

客户机的生命周期

客户机在经过几个阶段之后才会从主机中删除。如果Vagrant用来管理VM的生命周期的配置步骤、脚本和playbook在Vagrantfile中被完全捕获,则可以随时重新创建。

以下是的生命周期阶段是使用的相关Vagrant命令:

up - 该命令用于启动Vagrantfile中定义的虚拟机。如果它还没有在主机上,它将被创建为新的。客户机启动并运行后,用户就可以登录。

provision - Vagrantfile中定义的预配置器可以运行并且客户机已经处于运行状态。

reload - 如果在创建客户机之后更改了Vagrantfile,则可以使用此命令重新启动具有更改了配置的VM。

suspend/resume - 顾名思义这些命令可以用来挂起或恢复客户机。

halt - 关闭客户机,但底层资源仍然会被保留。

destroy - 关闭客户机并从主机中删除相关资源。

联网

由于可以在主机上创建多个客户机,因此可以使用它们完成各种网络操作任务,所有任务均由Vagrant管理。

转发端口

客户机上打开的端口不能直接被访问。客户机端口的访问需要经由主机端口转发到所要访问的客户机端口。例如,查看VM的Vagrantfile中的以下定义:

config.vm.network "forwarded_port", guest: 80, host: 8080

在此情形下,如果HTTP服务器在客户机上的端口80上运行,则可以通过http:// host-machine-name:8080来访问它。

专用网络

客户机可以使用DHCP来分配IP地址,或者可以在Vagrantfile中分配静态IP。以下是Vagrantfile中的相关示例配置:

config.vm.network "private_network", type: "dhcp"
config.vm.network "private_network", ip: "10.30.2.144"

Vagrant也支持公共网络,以将客户机公开给互联网。由于Vagrant主要用作开发基础设备,因此我不是特别清楚它的用途。

同步的目录

宿主机器上的Vagrantfile所在的项目根目录作为/ vagrant装载在客户机上,并且也是可配置的。其他磁盘位置可以进行如下映射:

config.vm.synced_folder "www/", "/srv/www"

第一个条目是在主机上的实际存在的文件夹,第二个条目是它被安装在客户机上的位置。如果源路径不是绝对路径,则相对于根目录的路径。

使用rsync,NFS和SMB等多种方法来支持在主机和客户机之间共享目录。共享文件夹的行为将取决于使用哪种方法进行设置。

多机器环境

可以在主机上创建多个客户机,并且仅受本地可用系统资源的限制。在下面的Vagrantfile代码片段中定义了两个客户机(web客户机和db客户机):

Vagrant.configure("2") do |config|
  config.vm.provision "shell", inline: "echo Hello"
    config.vm.define "web" do |web|
        web.vm.box = "apache"
    end
    config.vm.define "db" do |db|
        db.vm.box = "mysql"
    end
end

我们上面讨论过的各种配置选项可以分别应用到每个客户机上。在最后一个例子中,这些机器也可以共享同样的配置,内嵌的配置脚本被分别应用于两台机器上。

Vagrant的真正威力会在您的笔记本电脑上设置多机环境进行开发和测试时才体现出来。由于配置这样复杂的环境所涉及的所有步骤都在Vagrantfile和相关的脚本中被捕获,因此可以在团队成员之间共享,并进行修订控制。

把它带到生产环境

如果将我们前面看到的Ansible这样的CM提供者用于构建基于Vagrant的开发环境,那么将其推广到生产环境是非常容易的。

而且,这种以代码表示的开发环境的建立和维护过程将会影响应用程序开发过程。与应用程序代码一样,Vagrant代码可以在开发团队成员之间共享,并且可以进行版本控制。

如果公司没有在数据中心或科罗拉多地区拥有任何永久的基础设备,仅仅使用公共云,则可以使用Vagrant在笔记本电脑上设置本地开发环境来降低计算成本,而笔记本电脑往往功能强大,可以运行多个客户机。

进一步阅读

The Vagrant documentation简单而且简短,如果你打算使用Vagrant进行大量工作,就必须阅读全文。

本文的版权归 Steve Wang 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java后端技术

解决eclipse中egit中的cannot open git-upload-pack问题

  今天在使用eclipse的egit插件进行检出远程代码到本地时,出现了cannot open git-upload-pack错误,后经过努力解决该问题,记录...

491
来自专栏不想当开发的产品不是好测试

jmeter分布式环境

搭建jmeter分布式环境     (1)确定分布式结构,即1台机器部署master、几台机器部署slave?     (2)将相同版本的jmeter分别拷贝到...

1739
来自专栏WindCoder

Myeclipse错误集锦

Errors occurred during the build. Errors running builder 'DeploymentBuilder' on ...

491

在 OS X 上使用 Docker

在虚拟化技术盛行的当下,Docker 是其中的一支新兴力量。在使用 Linux 系统时,安装和使用 Docker 是十分容易的。但如果你和许多极客一样使用 OS...

2538
来自专栏Java学习123

oracle默认初始化用户名密码和密码修改

2828
来自专栏用户1191492的专栏

使用Ansible自动化您的(云或者本地)机器

Ansible任务执行多次和执行一次的效果一样。bash脚本没有很多额外的编码,运行多次通常不安全。而Ansible的任务根据“事实”(收集...

2037
来自专栏北京马哥教育

史上最全Linux命令科普 | 常见命令的名称是怎么来的?

1 目录缩写 缩写 | 全称 | 说明 --- | --- | --- | /bin | BINaries | 二进制可执行命令 /dev | DEVices...

2624
来自专栏青枫的专栏

log4j WARN 的解决办法

Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、U...

562
来自专栏互联网杂技

Laravel中运行Gulp任务的利器(一) —— Laravel Elixir简介及入门教程

对现代开发者而言,即使是构建一个很简单的web应用,也要编写很多任务,比如压缩图片、最小化CSS和JavaScript文件、移除调试代码、运行单元测试以及处理很...

2838
来自专栏iOS 开发杂谈

iOS之创建CocoaPods公有库采坑记

即上一篇iOS之使用Cocoapods创建公有仓库,本文就CocoaPods创建公有库踩到的坑做一下分享:

642

扫码关注云+社区