Loading...

Vagrant入门

Vagrant入门

安装

Vagrant 依赖 virtualbox,所以需要先安装,到这里下载:Download VirtualBox

截图录屏_选择区域_20210302103403

先安装 virtualbox:

caibh@book:/data/virtualbox$ sudo dpkg -i virtualbox-6.1_6.1.18-142142~Debian~buster_amd64.deb 

安装成功后还需要安装一下扩展包,扩展包需要打开virtualbox,在全局设定那里安装:

截图录屏_选择区域_20210302103633

按下图点击加号,选中下载的扩展包 Oracle_VM_VirtualBox_Extension_Pack-6.1.18.vbox-extpack 进行安装即可:

截图录屏_选择区域_20210302103708

hello world

国内访问官方的镜像比较慢,结局办法是到科大镜像站下载,比如这里有一个CentosOS的镜像: CentOS-7.box

下载好之后执行vagrant命令添加本地镜像:

$ vagrant box add centos7 CentOS-7-x86_64-Vagrant-2004_01.VirtualBox.box 

查看 box :

$ vagrant box list
centos7 (virtualbox, 0)

使用名为 centos7 的 box 新建一个虚拟机:

# 新建一个目录
$ cd /data/vagrant/vm
$ mkdir hello
$ cd hello

# 使用名为 centos7 的 box 新建一个虚拟机
$ vagrant init centos7

# 执行后会在 hello 目录下生成一个 Vagrantfile 文件
# 此时在 hello 目录下启动虚拟机
$ vagrant up

# 备注:打开 virturalbox 的 gui 界面,也能看到新建的虚拟机

挂起虚拟机:

# 注意:一定要在 hello 目录下执行
$ vagrant suspend

关闭虚拟机:

# 注意:一定要在 hello 目录下执行
$ vagrant halt

ssh 登录到虚拟机:

$ vagrant ssh

销毁虚拟机:

$ vagrant destroy
# 注意:执行后并不会删除 hello 目录下的 Vagrantfile 文件

Vagrant Box 国内镜像

小技巧:新建虚拟机时可以直接指定国内的镜像

# 新建一个名为 ubuntu-bionic 的虚拟机,镜像来源于国内的一个ubuntu镜像
# 语法:vagrant init <name> <url>
$ vagrant init ubuntu-bionic https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cloud-images/bionic/current/bionic-server-cloudimg-amd64-vagrant.box

关于 Box

通过 vagrant init 然后 vagrant up 可以触发下载一个box,我们也可以直接添加一个box:

# hashicorp/bionic64 来源于默认的官方仓库
$ vagrant box add hashicorp/bionic64

# 通过国内镜像添加 ubuntu 18.04 的box
$ vagrant box add ubuntu:18.04 https://mirrors.ustc.edu.cn/ubuntu-cloud-images/bionic/current/bionic-server-cloudimg-amd64-vagrant.box

我们可以在Vagrantfile中指定需要基于哪个box创建虚拟机:

Vagrant.configure("2") do |config|
  # 指定镜像
  config.vm.box = "hashicorp/bionic64"    
  # 可以指定镜像的版本
  config.vm.box_version = "1.0.282"
end

通过 url 位置的 box 创建虚拟机

# 指定官方的 url
Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/bionic64"
  config.vm.box_url = "https://vagrantcloud.com/hashicorp/bionic64"
end

# 或指定国内镜像的 url
Vagrant.configure("2") do |config|                                                 
  config.vm.box = "ubuntu-bionic"                                                 
  config.vm.box_url = "https://mirrors.ustc.edu.cn/ubuntu-cloud-images/bionic/current/bionic-server-cloudimg-amd64-vagrant.box"
end   

查看box列表

$ vagrant box list

删除box

$ vagrant box remove ubuntu-bionic

同步目录

通过 vagrant up 启动虚拟机后,vagrant ssh 进入虚拟机,会发现默认是使用 vagrant 用户登录进去的(账号密码都是vagrant),而且 Vagrantfile 所在目录和虚拟机中 /vagrant 目录是同步的,也就是说:

  • 在虚拟机中/vagrant目录新增一个 a.txt 文件,宿主机Vagrantfile所在目录就同步出现一个 a.txt 文件
  • 在宿主机Vagrantfile所在目录就新增一个 b.txt 文件,在虚拟机中/vagrant目录就会同步出现一个 a.txt 文件

配置虚拟机

场景:配置虚拟机,该虚拟机启动后就已经安装好一个Apache,并可以访问它的静态网页。

Vagrantfile 同级目录下创建 html/index.html文件:

$ cd /data/vagrant/vm/ubuntu
$ mkdir html
$ ls
html  Vagrantfile
$ cd html

# cat > index.html 表示cat的输出重定向到文件
# << EOF 表示输入重定向,结束符是EOF
$ cat > index.html << EOF
<!DOCTYPE html>
<html>
  <body>
    <h1>Getting started with Vagrant!</h1>
  </body>
</html>
EOF

Vagrantfile 同级目录下创建 bootstrap.sh脚本文件:

caibh@book:/data/vagrant/vm/ubuntu$ cat bootstrap.sh 
#!/usr/bin/env bash

# 替换仓库源
sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/' /etc/apt/sources.list

apt-get update
apt-get install -y apache2

# -L 表示判断/var/www是否链接文件
if ! [ -L /var/www ]; then
  rm -rf /var/www
  ln -fs /vagrant /var/www
fi

配置 Vagrantfile, 指定配置虚拟机时执行 bootstrap.sh 脚本(备注:下面的 ubuntu:18.04 本地镜像已提前通过 vagrant add ubuntu:18.04 https://mirrors.ustc.edu.cn/ubuntu-cloud-images/bionic/current/bionic-server-cloudimg-amd64-vagrant.box 创建):

Vagrant.configure("2") do |config|  
  config.vm.box = "ubuntu:18.04"
  config.vm.provision :shell, path: "bootstrap.sh"
end

如果未启动过虚拟机,那么执行 vagrant up,如果已经启动过,则执行 vagrant reload --provision 重新加载虚拟机配置。

当虚拟机重新启动后,vagrant ssh 进入虚拟机,验证配置:

vagrant@ubuntu-bionic:/vagrant$ wget -qO- 127.0.0.1
<!DOCTYPE html>
<html>
  <body>
    <h1>Getting started with Vagrant!</h1>
  </body>
</html>

注意:到此位置只能在虚拟机内部访问,还不能在宿主机上访问到该网页。

配置网络

要从宿主机访问上面的网页文件,需要配置一下端口转发:

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu:18.04"
  config.vm.provision :shell, path: "bootstrap.sh"
  config.vm.network :forwarded_port, guest: 80, host: 4567
end

由于之前已经执行过 bootstrap.sh 脚本初始化虚拟机的配置了,这里只是修改端口转发的配置,所以只需要 reload 一下,不需要加上 --provision 选项:

$ vagrant reload

在宿主机验证配置:

caibh@book:/data/vagrant/vm/ubuntu$ curl http://localhost:4567
<!DOCTYPE html>
<html>
  <body>
    <h1>Getting started with Vagrant!</h1>
  </body>
</html>

分享你的环境

安装配置 ngrok

Vagrant Share 功能依赖 ngrok(内网穿透工具),所以需要先注册一个 ngrok 账号

下载解压 ngrok 程序:

$ cd ~/app && mkdir ngrok && cd ngrok
$ wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
$ unzip ngrok-stable-linux-amd64.zip

配置到 PATH 环境变量中:

$ vim /etc/profile.d/env.sh

# 配置 ngrok 程序到 PATH 环境变量中
export NGROK_HOME=/home/caibh/app/ngrok
export PATH=$NGROK_HOME:$PATH

# 不要忘了刷新配置
$ source /etc/profile

配置ngrok账号分配的token,并启动:

$ ngrok authtoken 1pBzhxnSAoH14PC3uxxxxxxxxxx3YPWseMmZY1rYxxxxxx

$ ngrok help

$ ngrok http 80

安装 vagrant-share 插件

# 有点慢,但始终能装上
$ vagrant plugin install vagrant-share

执行一下,vagrant 就会调用 ngrok 开启内网穿透

# 在 Vagrantfile 同级目录下执行
$ vagrant share
==> default: Detecting network information for machine...
    default: Local machine address: 127.0.0.1
    default:  
    default: Note: With the local address (127.0.0.1), Vagrant Share can only
    default: share any ports you have forwarded. Assign an IP or address to your
    default: machine to expose all TCP ports. Consult the documentation
    default: for your provider ('virtualbox') for more information.
    default:  
    default: Local HTTP port: 4567
    default: Local HTTPS port: disabled
    default: Port: 2222
    default: Port: 4567
==> default: Creating Vagrant Share session...
==> default: HTTP URL: http://659b5409e9ca.ngrok.io

设置命令行补全

vagrant autocomplete install --bash --zsh

更多命令请参考:https://www.vagrantup.com/docs/cli

Vagrantfile 配置

利用循环配置多台机器

Vagrant.configure("2") do |config|
    # 新建三台虚拟机 node-1, node-2, node-3
    (1..3).each do |i|
      config.vm.box = "ubuntu:18.04"
      config.vm.define "node-#{i}" do |node|
        node.vm.provision "shell", inline: "echo hello from node #{i}"
      end
    end
end

参考

posted @ 2021-03-02 17:54  choizzzi  阅读(129)  评论(0编辑  收藏  举报