这次,千辛万苦搭好的虚拟机终于不用重头来过了!

Jeremy xu

从前爱撸码,如今爱遛娃的 

十年程序老兵

导言

相信同学们都遇到过这种场景:

每次搭建一个测试场景,会涉及很多台虚拟机,如果全部手工搭建,不仅很繁琐,而且不便于保存成果,下次遇到同样的需求又得重搭一次,而极容易出错,这些人肉操作也不便于修订管理。

所以

让我们祭出今天的主角

妈妈再也用不担心我搭建虚拟机!!!

使用vagrant搭建验证环境

这次的工作需要在一个独立的kubernetes环境调试功能,自然而然地想到在本机装个虚拟机搭建这个环境。不过有同事推荐我试一下vagrant。久闻vagrant大名,之前也经常在一些开源项目中看到它,今天花了些时间琢磨了这个新东西。

vagrant的简介

vagrant是hashicorp这家公司的产品,这家公司主要做云基础设施自动化的,其名下大名鼎鼎的产品有ConsulVaultNomadTerraform,这前在做微服务框架时做过他们的Consul,还是挺靠谱的。他们的产品感觉都比较有创新,而且基本上都开源了,他们的开源地址是这里 https://github.com/hashicorp

vagrant是用来管理虚拟机的,如VirtualBox、VMware、AWS等,主要好处是可以提供一个可配置、可移植和复用的软件环境,可以使用shell、chef、puppet等工具部署。所以vagrant不能单独使用,如果你用它来管理自己的开发环境的话,必须在自己的电脑里安装了虚拟机软件,我使用的是virtualbox。

vagrant提供一个命令行工具vagrant,通过这个命令行工具可以直接启动一个虚拟机,当然你需要提前定义一个Vagrantfile文件,这有点类似Dockerfile之于docker了。

跟docker类比这来看vagrant就比较好理解了,vagrant也是用来提供一致性环境的,vagrant本身也提供一个镜像源,使用vagrant init hashicorp/precise64就可以初始化一个Ubuntu 12.04的镜像。

安装vagrant

我本机是macOS系统,安装vagrant比较简单,命令如下:

其它操作下安装也挺简单的,参见官方文档https://www.vagrantup.com/docs/installation/就可以了。

使用vagrant

首先我这里创建第一个虚拟机,第一步是要将基础镜像拉回到本地缓存着,用以下命令:

对box的一系列操作命令文档见这里https://www.vagrantup.com/docs/cli/box.html

有了基础镜像box后,接下来在某一目录用box init即可创建一个初始的Vagrantfile文件:

vagrant init命令比较简单,参见官方文档就可以了。

接下来就是修改Vagrantfile文件了,打开Vagrantfile文件https://www.vagrantup.com/docs/vagrantfile/,看一看里面的注释大概就知道怎么写了,主要是ruby的语法,我们用得最多的就是虚拟机配置config.vm和ssh配置config.ssh,这个官方文档里将每个配置项都详细描述了,按描述配置就可以了,当然对于虚拟机、ssh本身有哪些配置可以调整提前要了解。

除了对虚拟机进行一些配置外,还可以通过各类Provisioner自动化地安装软件、调整配置。官方默认提供的Provisioner列表在这里。但我们平时用得比较多的主要有以下几个FileShellAnsibleDocker等,使用方法如下:

上面的示例都比较简单,每个Provisioner都有一些参数用于满足一些特殊场景,这些参数的用法参考官方文档就可以了。

除此之外还可以进行一些网络相关的配置,主要是映射一些端口到宿主机、设置私有网络、设置公开网络。如果是私有网络,则创建的虚拟机不对外公布,仅宿主机可访问。如果是公开网络,则创建的虚拟机会连接到局域网中的路由器上,如果能从路由器那里申请到IP,则其它主机也可以访问该虚拟机。

vagrant还提供多种机制将宿主机上的一些目录同步到虚拟机中,平时用得比较多就是它的默认机制:

Vagrantfile文件写好后,就可以以此为基础操作虚拟机了:

这样操作虚拟机真的是很方便啊。

还有一些高级功能,比如定义操控多个虚拟机、发布自已的镜像等,这些参考官方文档就可以了。

为什么用vagrant

vagrant的功能介绍得差不多了,再来说一下为啥要用vagrant。

原来我们搭建一个测试场景,会涉及很多台虚拟机,如果全部手工搭建,不仅很繁琐,而且不便于保存成果,下次遇到同样的需求又得重搭一次,而极容易出错,这些人肉操作也不便于修订管理。后面为了自动化实施,我们用了ansible之类工具,将操作步骤都写进ansible脚本中。ansbile方案确实解决了很大的问题,但失败率还是有些高,原因是待部署的虚拟机状态不统一。而vagrant直接将待部署的虚拟机也统一了,本身也支持用shell脚本、ansible脚本将操作步骤都记录下来。这样一来,只要拿到Vagrantfile,在任何主机上都只需要一条命令就可以将整套环境部署起来了。

比如我写了一个搭建单节点kubernetes环境的Vagrantfile,别人只要在本机安装好了vagrant,将这个vagrantfile下载下来,在该目录执行vagrant up命令,一个单节点kubernetes环境就自动创建好了。

总结

用正确的工具去做正确的事儿,真的是事半功倍。

参考

官方文档https://www.vagrantup.com/docs

https://jimmysong.io/posts/vagrant-intro/

https://github.com/jeremyxu2010/vagrant_files/

官网https://www.hashicorp.com/

端口到宿主机https://www.vagrantup.com/docs/networking/forwarded_ports.html

设置私有网络https://www.vagrantup.com/docs/networking/private_network.html

设置公开网络https://www.vagrantup.com/docs/networking/public_network.html

定义操控多个虚拟机https://www.vagrantup.com/docs/multi-machine/

发布自己的镜像https://www.vagrantup.com/docs/cli/cloud.html

搭建单节点k8s的vagrantfile https://github.com/jeremyxu2010/vagrant_files/tree/master/k8s-centos7

· END ·


点它!

原文发布于微信公众号 - 腾讯云TStack(gh_035269c8aa5f)

原文发表时间:2019-06-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券