Vagrant 虚拟机管理

  1. 1   安装
  2. 2   box 的管理
  3. 3   虚拟机管理
  4. 4   Vagrantfile
  5. 5   打包

个人操作系统并不需要配置化,但随着开发人员的复杂化,每个开发人员都需要同样的主机系统以保证开发环境的可移植性;另外一方面,随着微服务的推广需要多主机节点管理,重复性的指令配置消耗大量时间且容易出错,于是出现了多主机配置化,可以用现在流行的说法“基础设施即代码”,Infrastructure as code (IaC),例如 docker machine、vagrant,本文将讲解 vagrant 的使用,并安装 Kubernetes 集群进行实战。

1   安装

目前 vagrant 支持在常见操作系统 Linux, macOS 或 Windows 上安装,支持的虚拟机包括 VMware、VirtualBox 等。
macOS 分别下载安装即可:

  • VirtualBox,安装最新 6.0.6 版本
  • vagrant,安装最新 2.2.4 版本
    或者直接用 brew 安装:
    brew cask install virtualbox
    brew cask install vagrant

运行 vagrant version 查看版本信息。

2   box 的管理

box 相当于 Docker 基础镜像操作系统,这些镜像一般比那些 ISO 小,并进行一些设置,比如创建 vagrant(1000) 用户,镜像 .box 作为文件后缀。官方 Box 源,注意选择 virtualbox 下面的 box。

box 的操作是以 vagrant box 加子命令,它的操作跟虚拟机是无关的。

  • vagrant box list,查看本地上的 box
  • vagrant box add,The box descriptor can be the name of a box on HashiCorp’s Vagrant Cloud,
    or a URL, or a local .box file, or a local .json file containing
    the catalog metadata,可以用 –box-version 指定版本,否则下载最新版本
  • vagrant box remove,即使有基于该 box 运行的虚拟机也是可以删除的

下面我们用 centos/7 进行演示:

> vagrant box add centos/7
==> box: Loading metadata for box 'centos/7'
box: URL: https://vagrantcloud.com/centos/7
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) hyperv
2) libvirt
3) virtualbox
4) vmware_desktop

Enter your choice: 3
==> box: Adding box 'centos/7' (v1902.01) for provider: virtualbox
box: Downloading: https://vagrantcloud.com/centos/boxes/7/versions/1902.01/providers/virtualbox.box
box: Download redirected to host: cloud.centos.org
==> box: Successfully added box 'centos/7' (v1902.01) for 'virtualbox'!

> vagrant box list
centos/7 (virtualbox, 1902.01)

3   虚拟机管理

虚拟机管理相当于 Docker 的容器管理,是 box 镜像的运行时。

虚拟机的操作是以 vagrant 直接加子命令,以下命令基本都可以指定某一个 [name|id] 虚拟机运行操作,可以通过 vagrant COMMAND -h 查看

  • vagrant init,初始化,会创建一个 Vagrantfile,如果已经有配置文件就无需初始化
  • vagrant up,无界面启动(VBoxHeadless)虚拟机
    • 启动时会把当前目录(Vagrantfile 所在目录) COPY(不是挂载)到虚拟机 /vagrant,显示 Rsyncing folder: /Users/ada/vagtest/ => /vagrant,
    • 该命令会创建 .vagrant 隐藏目录
    • vagrant up –provision 强制运行 provision,适用于创建虚拟机路途失败但虚拟机已经创建而 provision 还没完全运行的情况
    • vagrant up [name|id] 可以指定启动某一个虚拟机
  • vagrant ssh,连接到虚拟机
    • 端口转发:默认配置端口转发config.vm.network "forwarded_port", guest: 22, host: 2222,启动时显示 22 (guest) => 宿主机的 2222 (host) (adapter 1,即网卡1),SSH address: 127.0.0.1:2222。登录时通过类似 ssh vagrant@127.0.0.1 -p 2222 进行连接(当然还需要 SSH 密钥信息才能登录,通常直接用 vagrant ssh 登录)。另外我们查看 VirtualBox 虚拟机设备/网络/网卡1/高级/端口转发,可以看到已经配置的 2222 到 22 的端口转发规则,且每次 up 都会重新设置端口转发规则。
    • ssh 密钥:可以用 --debug 参数打印执行信息,可以看到连接需要的 ssh 密钥 private_key 所在的位置,然后就可以直接用 ssh 命令连接 scp -i /Users/ada/vagjenkins/.vagrant/machines/jenkins-node01/virtualbox/private_key /Users/ada/.ssh/github/* vagrant@192.168.56.114:/home/vagrant/.ssh
    • vagrant ssh [name|id] 可以指定连接某一个虚拟机
  • vagrant reload,重启,一般在修改 Vagrantfile 后重启
  • vagrant halt,关机
  • vagrant destroy,删除虚拟机
  • vagrant provision,等同于 vagrant up –provision
  • vagrant suspend,挂起(保存虚拟机状态)
  • vagrant resume,对挂起状态(suspend)进行恢复,而不是像 up 一样的全新启动
  • vagrant status,查看状态
> mkdir vagtest
> cd vagtest

> vagrant init centos/7
> vagrant up
> ls
Vagrantfile
> vagrant ssh
Last login: Mon May 6 01:59:53 2019 from 10.0.2.2
[vagrant@localhost ~]$
> sudo -i
[root@localhost ~]#

从上面可以看出,与宿主机通信路由是 10.0.2.2,也可以在虚拟机查看 ip route show,注意要把 /etc/resolv.conf 的 DNS IP 设置为与宿主机通信路由 IP

4   Vagrantfile

上面的虚拟机管理还是基于单机的管理,只能将其文件化才能 box 打包和多虚拟机管理。

vagrant init centos/7 --box-version 1902.01,默认创建的 Vagrantfile:

Vagrant.configure("2") do |config|
config.vm.box = "centos/7"
config.vm.box_version = "1902.01"
end

  • 端口转发:config.vm.network "forwarded_port", guest: 22, host: 2222,也就是 Docker 发布端口
  • 目录共享:有多种方式,基本用法 config.vm.synced_folder "src/", "/srv/website",对开发共享代码非常有用,其它还有 NFS(not work on Windows)、SMB(Windows or macOS)等

5   打包

必须先关闭虚拟机,然后运行打包
vagrant package --output xxx.box




参考文献
[1] 官方文档 https://www.vagrantup.com/docs/index.html