简介
一般来说, 线上环境和预发布环境都有充足的配置化, 既可以清楚的确认环境的组成细节, 又可以高效快速从 0 重建. 但是个人的开发测试环境, 可能就没有这么完美. 也许是公司公用的几台测试机, 也许是自己的本地环境. 折腾出了问题, 还是比较麻烦的. 我个人认为, Docker 做开发环境, 也是差强人意, 还是本地环境或是虚拟机比较适合.
显然, 一个良好, 可快速重新构建的开发环境, 可以极大的提高自己的效率.(开发环境折腾坏了, 是常有的事. 如果能快速重建就很好了.) 如果还能将你的环境, 轻松分享给其他人. 也可以解决 "我那里还能跑, 为什么到你这里就跑不了" 的经典问题.
而 Vagrant 就是这样一种工具, 可以控制其他虚拟化工具比如 VirtualBox 和 VMware, 并且能配置文件从 0 重建环境. 而且也能和 Ansible,Chef,Puppet 等自动化工具联动.(如果其他环境使用上述自动化工具构建, 那么 Vagrant 可以轻松重用.
最后, 本文选用 Win10 + VirtualBox + Vagrant 作为基础, 在 CentOS 系统中使用 rpm 方式简易安装 MySQL.
1, 下载安装
Vagrant 的安装方式和虚拟机类似, 除了软件本身, 还需要镜像. Vagrant 使用一种特殊的自制镜像, 以. box 结尾. 需要从官网或第三方资源处获取.[注意, 这种特殊镜相区分虚拟机工具, 比如 Virtuabox 和 VMware 的镜像不同]
软件本体直接从官网下载即可: https://www.vagrantup.com/downloads
特殊镜像有如下几种获取方式:
Vagrant 官网: https://app.vagrantup.com/boxes/search [速度较慢
操作系统官网: [这里是 CentOS 的例子
第三方镜像站: http://www.vagrantbox.es/ [官网可能太慢, 可以考虑从第三方站点获取镜像
这里没有说明虚拟化环境本身的安装, VirtualBox 或者 VMware 均可, 直接从对应官网安装即可.
2, 基础使用方法
2.1, 快速上手:
Vagrant 是命令行工具, 安装完之后, 可以在 powershell 或者 cmd 中使用. 想要快速启动一个 Vagrant 虚拟机, 可以使用如下操作.
建议使用一个空文件夹进行操作, 镜像不一定要在这个目录中.
小技巧: 在文件夹空白处: Shift + 右键, 即可在该位置打开 Powershell 或者 cmd
- Vagrant box add [env_name] [url/path] # 导入镜像, 这里也可以使用本地下载好的镜像路径, 不一定是 url.
- Vagrant init [env_name] # 初始化.
- Vagrant up #启动
- Vagrant SSH #SSH 进入虚拟机
通过上述几条指令, 就可以载入下载好的镜像, 初始化, 并启动一个虚拟机, SSH 进入虚拟机.
第二步 init 要注意, 命名和第一条命令的命名要一致.
win10 也可安装 SSH, 控制面板中可以打开.
2.2, 其他常用命令, 注意点:
- Vagrant box add #添加基础镜像配置
- Vagrant init # 初始化虚拟机 (初始化后, 可自行修改配置文件进行定制
- Vagrant up # 创建并启动虚拟机
- Vagrant halt # 关闭虚拟机
- Vagrant destroy #销毁当前虚拟机
- Vagrant status #查看虚拟机运行状态
- Vagrant SSH # SSH 至虚拟机
- Vagrant package #导出镜像
上述几条命令, 基本就可以轻松使用 Vagrant 了. 不过还有几点需要注意:
Vagrant package 可以将自己的镜像打包, 即可轻松分享给其他人.(适用于变动较少的镜像)
PS: 更建议的方式是, 共享基础镜像 + vagrantfile 配置文件. 直接分享配置文件即可, 更加快捷.(如果频繁变动, 直接编辑配置文件会比较轻松, 不要在镜像里手动修改, 难以确认到底做了什么)
Vagrant destroy 会销毁实例, 也就是 VirtualBox 中看到的虚拟机. 但是不会销毁配置, destroy 之后, 可以直接 up 重建.
默认用户不是 root, 但是可以 sudo 执行命令, 无需密码.(如果有其他需要, 自行修改即可.
随时都可以用 Vagrant status 确认虚拟机状态, 是否启动, 停止等.
参考:
3, 更多定制化
Vagrant init 初始化结束后, 会在当前目录生成一个 Vagrantfile, 你可以对其进行修改, 实现各种定制化.
比如 config.vm.network "private_network", ip: "192.168.33.10" 修改网卡默认 ip.
一个基础的初始文件很简单, 大概是这样:
- # -*- mode: Ruby -*-
- # vi: set ft=Ruby :
- Vagrant.configure("2") do |config|
- config.vm.box = "MySQL-test00"
- # 在这里增加其余配置项
- end
根据根据需要, 增加各种配置项即可.[比如网卡采用桥接, CPU 核数, 内存等等.
更多配置项可以参考: https://www.vagrantup.com/docs/vagrantfile
也可实现一个配置文件, 启动多个虚拟机. 只要都声明正确即可.
其中, 有几个配置项我觉得比较重要:
网卡 / 路由配置:
可以进行桥接, 网卡配置等. 解决虚拟机的网络配置问题.
文件复制到虚拟机内: https://www.vagrantup.com/docs/provisioning/file
可以在创建虚拟机的时候, 从宿主机拉取各种资源到虚拟机内部.(比如各种软件包, 配置文件)
自定义初始化 (provision): https://www.vagrantup.com/docs/provisioning
这里就是重中之重, 实现高度定制的初始化. Ansible,Chef,Puppet 等就是在这里加入.(默认是使用 shell 命令进行初始化)
provision 不是在每次启动都会运行, 只有在第一次 up, 以及每次 privision 时才会执行.
4, 基于 Vagrant 简易安装 MySQL
本文采取 rpm 方式安装 MySQL. 你可以在官网 https://dev.mysql.com/downloads/repo/yum/ 获取到指定版本的 MySQL repo 下载链接.
对于 rpm 包的引入方式, 有如下 2 种:
下载 rpm 包到本地, 文件复制到虚拟机内, 可参考: https://www.vagrantup.com/docs/provisioning/file
或者直接在虚拟机内通过 curl 获取.
Vagrantfile 实例
- # -*- mode: Ruby -*-
- # vi: set ft=Ruby :
- Vagrant.configure("2") do |config|
- config.vm.box = "test02"
- #桥接网卡配置
- config.vm.network "public_network", bridge: "Realtek PCIe GbE Family Controller"
- #手动配置网关 (其实也可使用 ansible 完成这一步)
- #config.vm.provision "shell",
- # run: "always",
- # inline: "route add default gw 192.168.50.1"
- #定义一个脚本 (安装基础网络工具, yum 安装 MySQL)
- $script = <<-'SCRIPT'
- curl -o MySQL.rpm https://repo.mysql.com/mysql57-community-release-el7-3.noarch.rpm
- sudo rpm -ivh MySQL.rpm #下载并导入 rpm 包
- sudo yum makecache #生成 meta 缓存
- sudo yum install -y MySQL-community-{client,libs,common,server}.x86_64 #安装 MySQL
- sudo yum install -y.NET-tools #安装基础网络工具
- SCRIPT
- # 运行上面定义好的脚本 (使用 Ansible 更佳)
- config.vm.provision "shell", inline: $script
- end
最终配置完成后, 就可以 Vagrant up 一键安装 MySQL 虚拟机了. 也可 destroy+up 快速重建.
5, 小结
本文主要讲解了 Vagrant 的基础使用方法, 包括安装, box 镜像下载, 配置文件修改, 基础命令等. 熟悉了这些, 就可以快速高效的维护自己的开发测试环境. 也可以通过共享基础镜像 + 分享 Vagrantfile 的方式, 来将自己的镜像分享给其他人.
最后还简单实现了一个简单的 MySQL 的 Vagranfile, 初始化使用了最直接的 shell. 如果能使用 Ansible 或者其他自动化工具, 相信 Vagrant 会更加好用.
参考:
来源: https://segmentfault.com/a/1190000023517977