Vagrant入门
Vagrant入门
安装
Vagrant 依赖 virtualbox,所以需要先安装,到这里下载:Download VirtualBox
先安装 virtualbox:
caibh@book:/data/virtualbox$ sudo dpkg -i virtualbox-6.1_6.1.18-142142~Debian~buster_amd64.deb
安装成功后还需要安装一下扩展包,扩展包需要打开virtualbox,在全局设定那里安装:
按下图点击加号,选中下载的扩展包 Oracle_VM_VirtualBox_Extension_Pack-6.1.18.vbox-extpack
进行安装即可:
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