Carve Your Laptop Into VMs Using Vagrant
原文作者:Thomas Kurian Theakanath
原文地址:https://dzone.com/articles/carve-up-your-laptop-as-virtual-machines-using-vag
译者:微博@从流域到海域
译者博客:blog.csdn.net/solo95
本文同样刊载于腾讯云+: https://cloud.tencent.com/developer/article/1014491
使用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"
在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进行大量工作,就必须阅读全文。