对于开发人员来说,Vagrant就是一个提供标准化开发环境的工具。通过Vagrant:
- 使每个开发人员电脑上的代码运行环境一致,再也不会出现“在我电脑上运行起来明明没有问题的”这样的开发环境不一致的问题。
- 你可以使用Vagrant在windows下提供linux运行环境,让你可以在windows下使用你熟悉的IDE开发,而代码会同步到Vagrant上运行。
- vagrant还支持使用远程provider,你在本地编写代码,而代码会自动同步到你的远程主机上执行
- 因为Vagrant通过配置文件来定义标准环境,所以你可以使用git等工具进行版本管理
总而言之,Vagrant确实是个好东西。不过,装Vagrant之前也还要考虑一下性能问题,Vagrant需要一个Provider来提供原型环境,这个Provider可以是本地的Virtualbox、VMWare等虚拟机,也可以是远程的一台主机,如果你使用本地虚拟机作为Provider的话,请确保自己的电脑配置足够跑一台虚拟机,并且在BIOS中打开虚拟化。
接下来说一下在windows下使用Virtual box作为Provider,搭建Vagrant开发环境的一个过程。
安装Virtualbox和Vagrant
到Virtualbox官网下载安装包,注意目前不要下5.2.X版本的,因为5.2.x官方包中的Guest Additions有问题(见下图),而Vagrant刚好要用到。这里我们下载5.1.30版本的。
到Vagrant官网下载安装包,双击安提示安装即可。
Vagrant基础使用
1、打开一个文件夹作为工作目录,这个文件夹的内容将会被同步到虚拟机上。本文以D:\myproject
作为工作目录来演示
2、初始化vagrant配置。打开命令行,切换到D:\myproject
,输入命令:
vagrant init ubuntu/xenial64
这会在你的工作目录下生成一个Vagrantfile
文件。参数ubuntu/xenial64
表示使用ubuntu xenial64 镜像作为基础环境,你可以在vagrant boxes search里面找到所有的镜像
3、启动Vagrant。输入:
vagrant up
4、登录 vagrant。输入如下命令,不需要密码,直接进入:
vagrant ssh
这里直接在windows命令行中登录,登录之后可以直接在命令行使用linux命令,但是长远来看,使用Putty等工具来登录使用起来更方便,后面将会讲到如何用Putty登录。
5、查看同步文件夹
在D:\myproject
下新建一个文件,然后输入如下命令,在Vagrant中查看:
cd /vagrant
ls
你会看到你新建的文件出现在/vagrant
目录下。默认情况,Vagrant会同步你的工作目录到/vagrant
目录
常用Vagrant命令
你可以在windows命令行输入:
vagrant -h
查看所有命令,常用的如下:
vagrant init
:初始化vagrant,这会创建一个Vagrantfile文件vagrant up
:启动vagrant,这启动virtualbox虚拟机vagrant halt
:停止vagrant ,这会停止virtualbox虚拟机vagrant destroy
:这会彻底删除当前工作目录下的vagrantvagrant reload
:重新加载Vagrantfile文件,在每次修改完Vagrantfile文件之后都要执行vagrant provision
:重新执行初始化脚本,在每次修改完初始化脚本文件之后都要执行。初始化脚本文件可以在Vagrantfile中指定,后面会讲到vagrant ssh
:登录到vagrantvagrant ssh-config
:查看登录配置,包括用户名,私钥存放地址等
配置启动脚本
1、在D:\myproject
下创建一个bootstrap.sh
文件,下面是一个示例脚本,安装curl、git和 go语言环境,注意这个脚本需要从google下载go安装包,需要设置外网代理:
#!/bin/sh
# 切换到工作目录
cd /vagrant# 更新系统
sudo apt-get -y update && sudo apt-get -y upgrade# 安装实用程序
sudo apt-get install -y curl
sudo apt-get install -y git# 安装go
## 注意这里保存环境变量要使用绝对路径 /home/ubuntu/.profile ,而不要使用相对路径 ~/.profile
## 这是因为执行该脚本的是guest用户,登录时却是ubuntu用户
## go环境变量也设置到guest用户,这样下次检查就已经有了,不需要每次安装
if [ -z `which go` ]; then
echo "install go ........"
wget -q https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.8.linux-amd64.tar.gz
echo "export PATH=$PATH:/usr/local/go/bin" >> /home/ubuntu/.profile
echo "export PATH=$PATH:/usr/local/go/bin" >> ~/.profile
export PATH=$PATH:/usr/local/go/bin
fi
2、打开Vagrantfile,添加一行provision
配置,整个配置文件看起来如下:
Vagrant.configure("2") do |config|config.vm.box = "ubuntu/xenial64"config.vm.provision "shell", path: "bootstrap.sh"
end
3、重新加载配置文件并重新执行初始化脚本
vagrant reload
vagrant provision
执行完之后,环境中就带有了go语言环境。
使用远程启动脚本
可以将path
配成一个URL,这样大家都从网络上统一下载,很方便管理
Vagrant.configure("2") do |config|config.vm.box = "ubuntu/xenial64"config.vm.provision "shell", path: "https://example.com/bootstrap.sh"
end
设置Provision其它参数
provision除了path
参数之外,还有很多参数可以使用,参考这里。比如要多加一个binary
参数,这个参数可以自动将windows换行符替换成unix风格的换行符,配置如下:
Vagrant.configure("2") do |config|config.vm.box = "ubuntu/xenial64"config.vm.provision :"shell" do |s|s.path="bootstrap.sh"s.binary=trueend
end
配置端口映射
比如要将虚拟机的9090端口映射到主机的19090端口,可以使用如下配置:
Vagrant.configure("2") do |config|config.vm.box = "ubuntu/xenial64"config.vm.provision "shell", path: "bootstrap.sh"config.vm.network "forwarded_port", guest: 9090, host: 19090, host_ip: "127.0.0.1"
end
这样就可以直接使用127.0.0.1:19090
访问虚拟机的9090端口了
使用putty登录
使用vagrant ssh
直接登录是不需要输入用户名密码的,但是如果你使用Putty直接连接到127.0.0.1:2222
,你会发现它需要你输入用户名密码。那么怎么配置才能让Putty也能直接登录进去呢?
这里我们将用到putty和puttygen两个程序,点击链接可下载。
1、首先查看Vagrant的登录配置,输入:
vagrant ssh-config
你会看到如下信息:
Host defaultHostName 127.0.0.1User ubuntuPort 2222UserKnownHostsFile /dev/nullStrictHostKeyChecking noPasswordAuthentication noIdentityFile D:/myproject/.vagrant/machines/default/virtualbox/private_keyIdentitiesOnly yesLogLevel FATAL
可以看到Port
是登录端口,User
是登录名,IdentityFile
是私钥文件的位置
2、生成putty可识别的私钥文件。
打开Puttygen.exe,直接点击load
在弹出框中选择我们私钥文件,点击打开。不知道私钥文件的位置可以用vagrant ssh-config
命令查看,这里我们已经查到是放在D:/myproject/.vagrant/machines/default/virtualbox/private_key
直接点击save private key
按钮,让后将私钥放在你想要的位置。
3、使用Putty登录
设置登录地址和端口,可以使用vagrant ssh-config
命令查看
设置登录用户名,这个也可以使用vagrant ssh-config
命令查看
设置私钥文件地址
记得保存
处理文件结束符问题
是windows下和在Unix风格系统下使用不同的文件结束符。虽然Vagrant可以自动同步文件,但却不会自动替换掉文件结束符,所以,我们需要自行处理。下面简单说两种方法:
使用git进行替换
1、执行:
git config --global core.autocrlf input
这个命令的意思是在git提交的时候自动将CRLF替换成LF
2、在工作目录下创建一个.gitattributes
文件,添加如下内容:
text=auto
text eol=lf
参考Git End-of-Line Normalization by AutoCRLF with Input
使用编辑器替换
这里介绍使用webstorm自动替换,打开file,setting:
这会在每次保存时自动保存为unix风格的文件结束符