最早的时候,是在某学弟的说说中看到 vagrant。github 上搜了一下,发现 star 数还挺多的。随后的岁月里,常常能看到这个名词,今天研究一下。
不知道这到底属于那个节点,姑且归类为部署吧。
Vagrant 提供了基于企业级标准技术的易配置、可重复、可移植的工作环境,从而最大化团队的生产力和灵活性。
Vagrant 可构建在由 VirtualBox,VMware,AWS 以及其他提供商提供的机器上,并且可以使用 shell 脚本,Chef,Puppet 等配置管理工具。
vagrant 的特点:
Vagrantfile
和vagrant up
,适用人群广 (开发者,运维人员,设计师)vagrant 其实就是封装了的 Virtualbox 的 API 的 ruby DSL,抽象和简化了某些操作,用一个命令以及配置文件,而不是一堆命令去管理和使用 vm。
先决条件:安装virtualbox - 安装的 virtualbox 版本为4.3.20r96996
(vboxmanage -v)。
安装使用 installer,用 RubyGems 安装问题多多,依赖巨复杂,vagrant 安装的版本是 1.7.2 (vagrant version)
注:哪天,小爷我不开心了,要将 vagrant 删掉,只要删除
/opt/vagrant
目录和/usr/bin/vagrant
文件。用户数据存放在~/.vagrant.d
中,下次重装可直接复用。
起步
按如下的命令列表,即可启动进入一个虚拟机中:
mkdir test && cd test
vagrant box add base http://files.vagrantup.com/lucid32.box # 这里的模式是 vagrant box add {title} {url}
vagrant init base # 初始化一个box为base的Vagrantfile,默认box就是base
vagrant up # 启动虚拟机
vagrant ssh # ssh到虚拟机环境中
boxes
vagrant 强大之处,在于使用镜像 (image) 快速创建 (克隆) 虚拟机。vagrant 中将镜像称作 box,创建Vagrantfile
之后,最重要的就是指定环境所用的 box。
box 的子命令如下:
一些镜像 (box) 的地址是:
若是从http://www.vagrantbox.es/直接下载镜像,则需要运行如下的命令:
mkdir test2 && cd test2
wget https://github.com/jose-lpa/packer-ubuntu_14.04/releases/download/v2.0/ubuntu-14.04.box
vagrant init ubuntu-14.04.box # ubuntu-14.04.box为已下载的某镜像文件
vagrant up
vagrant ssh
备注:起初看到启动 vm 时,可以通过 ssh 进行连接的,尝试
ssh [email protected]:2200
,一直 timeout。看了官方文档后,才知道原来使用vagrant ssh
命令。注意:不要在虚拟机中运行
rm -rf /
,因为虚拟机与宿主机器存在共享目录/vagrant
。
同步目录
同步目录:貌似和共享文件夹又有所不同,vagrant 会自动 sync 文件,所以,这句话表示存在两个文件还是一个文件。不过,同步和共享肯定是不同的。
自动配置
Vagrant 内建了对自动配置的支持,其可以在vagrant up
时,自动安装软件。从而使其客机虚拟机可以重复创建且随时可用。
举个例子,比如安装 apache:
bootstrap.sh
的文件:#!/usr/bin/env bash
apt-get update
apt-get install -y apache2
if ! [ -L /var/www ]; then
rm -rf /var/www
ln -fs /vagrant /var/www
fi
config.vm.provision :shell, path: "bootstrap.sh"
或者直接写在 Vagrantfile 文件中:
config.vm.provision "shell", inline: <<-SHELL
sudo apt-get update
sudo apt-get install -y apache2
if ! [ -L /var/www ]; then
rm -rf /var/www
ln -fs /vagrant /var/www
fi
SHELL
网络
网络主要就是端口映射和内网 IP 的设置,端口映射的配置为:
config.vm.network :forwarded_port, host: 4567, guest: 80
共享
共享分发开发环境,需要一个免费的 HashiCorp's Atlas 帐号。使用命令如下:
vagrant login
vagrant share
注:感觉 vagrant 所做的,其实和 docker hub 很相似,都是基于 image 的仓库。
Providers
Vagrant 支持很多不同后端 vm 后端,除了 VirtualBox,还有 VMware, AWS, Docker 等。这些 provider 本身,可以无缝切换。
vagrant 提供了丰富操作的命令,其中,常用的一些如下:
vagrant up # 启动虚拟机,会执行相应的自动配置
vagrant halt # 关机
vagrant reload # 重新启动,主要用于重新载入配置文件
vagrant suspend # 挂起当前虚拟机
vagrant resume # 恢复被挂起的vm
vagrant box list # 列出所有box列表
vagrant box remove {basename}
vagrant destroy # 停止当前正在运行的虚拟机并销毁所有创建的资源
vagrant package # 把当前的运行的虚拟机环境进行打包,可用于分发开发环境
vagrant plugin # 安装卸载插件
vagrant provision # 设置基本的环境,进一步设置可以使用Chef/Puppet进行搭建
vagrant ssh-config # 输出ssh连接的一些信息
vagrant status # 获取虚拟机状态
vagrant version # 获取vagrant的版本
除了上面的那些命令,还有 login、rdp、share、global-status 等等,详细参考 vagrant -h
。
剩下的大部分需要的学习的部分都在了解如何配置 Vagrantfile 文件。
vagrant 的用处:单机模拟多台机器,从而测试分布式的集群环境。Vagrantfile 中可以定义 vm 的角色,也可vagrant ssh {role-name}
到特定的机器上去。
vagrantfile 相关的配置涉及 vm、ssh、winrm、vagrant、box、network、同步目录,多机器配置,虚拟技术提供方,插件 (似乎提供不少插件) 以及推送 (Push)。
简单的配置介绍如下:
config.vm.box = "base" # vm的box的基,默认为base
config.vm.customize ["modifyvm", :id, "--name", "gogojimmy", "--memory", "512"] # 配置vm的各种参数
config.vm.host_name = "xxx" # 配置主机名,很重要的标识
config.vm.network # 两种桥接方式,私有和公共
同步目录:貌似和共享文件夹又有所不同,vagrant 会自动 sync 文件,所以,这句话表示存在两个文件还是一个文件。
最为强大的是多虚拟机的系统设置,只需在同一Vagrantfile
中定义不同的用户角色即可:
config.vm.define :app do |app_config|
app_config.vm.host_name = "app"
app_config.vm.network "private_network", ip: "33.33.13.10"
end
config.vm.define :db do |db_config|
db_config.vm.host_name = "db"
db_config.vm.network "private_network", ip: "33.33.13.11"
db_config.vm.provider "virtualbox" do |vb|
vb.memory = "512"
end
end
config.vm.define :cache do |cache_config|
cache_config.vm.host_name = "cache"
cache_config.vm.network "private_network", ip: "33.33.13.12"
end
通过上面的配置,然后运行vagrant up
,分分钟就可以启动 3 台虚拟机了。具体输出如下:
Bringing machine 'app' up with 'virtualbox' provider...
Bringing machine 'db' up with 'virtualbox' provider...
Bringing machine 'cache' up with 'virtualbox' provider...
==> app: Clearing any previously set forwarded ports...
==> app: Fixed port collision for 22 => 2222. Now on port 2200.
==> app: Clearing any previously set network interfaces...
==> app: Preparing network interfaces based on configuration...
app: Adapter 1: nat
app: Adapter 2: hostonly
==> app: Forwarding ports...
app: 22 => 2200 (adapter 1)
==> app: Booting VM...
==> app: Waiting for machine to boot. This may take a few minutes...
app: SSH address: 127.0.0.1:2200
app: SSH username: vagrant
app: SSH auth method: private key
app: Warning: Connection timeout. Retrying...
==> app: Machine booted and ready!
==> app: Checking for guest additions in VM...
app: The guest additions on this VM do not match the installed version of
app: VirtualBox! In most cases this is fine, but in rare cases it can
app: prevent things such as shared folders from working properly. If you see
app: shared folder errors, please make sure the guest additions within the
app: virtual machine match the version of VirtualBox you have installed on
app: your host and reload your VM.
app:
app: Guest Additions Version: 4.2.0
app: VirtualBox Version: 4.3
==> app: Setting hostname...
==> app: Configuring and enabling network interfaces...
==> app: Mounting shared folders...
app: /vagrant => /home/xiajian/works/test/vargant
==> app: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> app: to force provisioning. Provisioners marked to run always will still run.
。。省略DB和Cache的启动。。。
备注:不同版本的 vagrant 之间的配置可能有所区别,具体的以当前生成的 Vagrantfile 中配置描述的为准。
vagrant reload
只能对已有的虚拟机进行配置的重新载入,对于未创建的虚拟机则不作处理。所以,虚拟机的启动, 主要还是靠vagrant up
命令。
此外,virtualbox 仅仅是 vagrant 的一个虚拟机提供商,Docker 和 VMWare 也是 vagrant 的 provider。
vagrant 文档提供了翔实的信息,更多可参考https://docs.vagrantup.com/v2/ 。
虚拟化的好处:
术语: Host OS(宿主 os), Guest OS(支持任何 X86 的系统), 虚拟机 (VirtualBox 为 Guest OS 创建的特定环境,VirtualBox 默认将虚拟机看作一组参数 - 决定了虚拟机的行为), 客机增强件 (安装在虚拟机中,提高客机性能和额外的功能支持)
Virtualbox 的功能概览:
VirtualBox 提供了不少命令行工具:
备注:上面的这些命令也存在小写字母版的,果然,要大写什么的,太不方便了。
需要编译并加载 vboxdrv 内核模块,VirtualBox 应用程序通过 Unix 本地套接字与后台程序通信。
两种镜像文件:动态扩展的镜像文件、固定大小镜像文件。
更多相关技术,可以参考 VirtualBox 提供的相关的文档:https://www.virtualbox.org/wiki/Documentation
虚拟化相关的技术:XEN, KVM(OpenStack 利用),Hypervisor,基于 LXC 的 Docker。虚拟化的技术,需要对 OS 的理解加深。
原本是为了装 qq,才去装 virtualbox 和 XP 的镜像系统,结果用了一段时间后,发现体验和感觉都相当的不错。这让我意识到虚拟环境的有用和高效之处。
阅读了一下 Virtualbox 的文档之后,发现 Virtualbox 有提供 API 和 SDK 的接口。这样就很好理解 vagrant 的开发的基础。此外,偶然发现,vagrant 的作者在 11 年的时候,曾开发过一个virtualbox的 gem。此外,Virtualbox 本身以依赖其他的一些 GNU 的虚拟机的代码,比如 bochs。