vagrant是一款通过配置文件创建虚机的命令行工具。平时在本地搭建开发环境需要跑虚拟机时用它很方便,这里记录下简单使用步骤。

vagrant包含比较丰富的功能,这里只介绍最常用的:如何用vagrant创建虚拟机。 使用vagrant创建虚拟机首先需要下载想要创建的虚拟机操作系统的box。box是其他人做好的虚拟机模板,可以理解为其他人做好的虚拟机;通过vagrant box add可以导入box到本地vagrant box目录。

Vagrant Cloud这里可以看到其他人分享的box,找到你需要的然后通过vagrant box add命令来导入就行。由于大陆网络环境直接导入时vagrant会通过网络将box下载到本地,这比较慢;也可以在网站上找到box后通过页面下载到本地后添加。例如我是这么调价centos8 box的

vagrant box add --name generic/centos8 ~\Downloads\xxxx

xxxx就是下载好的box文件。添加好后通过vagrant box list可以查看本地的box。

接下来新建目录,然后初始化Vagrantfile;Vagrantfile可以理解为配置文件,vagrant读取文件中的配置来创建对应配置的虚拟机,不同的虚拟化平台(或管理软件)可能有不同的配置,可以看官方文档

1
2
mkdir vagrant-test & cd vagrant-test
vagrant init

vagrant init之后会创建一个默认Vagrantfile,使用base box:

Vagrant.configure("2") do |config|

  config.vm.box = "base"

end

vagrant 是ruby写的,这是ruby语法。实际上不存在base这个box,此时如果试图通过vagrant up来启动会报错。我们在init的时候应该指定box,删掉vagrant生成的Vagrantfile.vagrant目录重来:

vagrant init generic/centos8

然后指定vagrant up即可启动虚拟机。启动后通过vagrant ssh可以直接通过ssh进入虚拟机,用户是vagrant。vagrant在启动虚拟机后会生成一个vagrant用户以及一对ssh密钥,将公钥插入虚机的ssh服务。默认虚拟机的配置由box决定。通过vagrant destroy即可销毁虚拟机。

下面通过修改配置将虚拟机改为1个CPU核心,256M内存,且修改root用户密码为root:

Vagrant.configure("2") do |config|
  
  config.vm.box = "generic/centos8"

  config.vm.provider "virtualbox" do |vb|
    vb.memory = "256"
    vb.cpus = "1"
  end

  config.vm.provision "shell", inline: <<-SHELL
    echo root | sudo passwd root --stdin
  SHELL
end

我这里使用的是virtualbox,不同的虚拟平台有不同的配置,可以看对应官方文档。改root密码通过shell这个provision来实现。改完后通过vagrant up即可启动,vagrant suspend可以暂定虚机。

在一个Vagrantfile中可以定义多个虚机,下面来定义三台虚机,写三台虚拟都与host共享同一个目录:

Vagrant.configure("2") do |config|

  config.vm.define "node1" do |node1|
    node1.vm.box = "generic/centos7"
    node1.vm.host_name = "node1"
    node1.vm.network "public_network"
    node1.vm.synced_folder "./data", "/vagrant_data"
    
    node1.vm.provider "virtualbox" do |vb|
      vb.memory = "256"
      vb.cpus = "1"
    end

    node1.vm.provision "shell", inline: <<-SHELL
      echo root | sudo passwd root --stdin
    SHELL
  end

  config.vm.define "node2" do |node2|
    node2.vm.box = "generic/centos7"
    node2.vm.host_name = "node2"
    node2.vm.network "public_network"
    node2.vm.synced_folder "./data", "/vagrant_data"
    
    node2.vm.provider "virtualbox" do |vb|
      vb.memory = "256"
      vb.cpus = "1"
    end

    node2.vm.provision "shell", inline: <<-SHELL
      echo root | sudo passwd root --stdin
    SHELL
  end

  config.vm.define "node3" do |node3|
    node3.vm.box = "generic/centos7"
    node3.vm.host_name = "node3"
    node3.vm.network "public_network"
    node3.vm.synced_folder "./data", "/vagrant_data"
    
    node3.vm.provider "virtualbox" do |vb|
      vb.memory = "256"
      vb.cpus = "1"
    end

    node3.vm.provision "shell", inline: <<-SHELL
      echo root | sudo passwd root --stdin
    SHELL
  end

end

vagrant up一键依次启动三个虚机。