vagrant 学习笔记


## 安装virtual box:

https://www.virtualbox.org/

## 下载vagrant 镜像:

#### 查找并下载官方的box镜像:
https://app.vagrantup.com/boxes/search

#### 还有这个网址里面也有很多:
http://www.vagrantbox.es/

#### 我用了这个镜像centos6.5 x86_64:
https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box

## 下载并安装vagrant(根据版本不同 自行选择安装):

https://www.vagrantup.com/downloads.html

## 初始化创建文件 和 Vagrantfile文件:

$ vagrant box add {title} {url}
$ vagrant init {title}
$ vagrant up

### 示例:
mkdir -p /opt/box/
cd /opt/box/
wget https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box

### 添加一个box到系统并命名为centos65:
vagrant box add centos65 centos65-x86_64-20140116.box

### 初始化系统:
vagrant init centos65

### 启动虚拟机:
vagrant up

### 关闭虚拟机:
vagrant halt

### 查看虚拟机状态:
vagrant global-status

### 重启虚拟机:
vagrant reload ID

### 登陆系统:
vagrant ssh


** 多看看启动命令 里面会有很多的启动信息 和 关于虚拟机的参数:

### 跟宿主机共享目录:

#### 默认共享:
** 默认和vagrantfile 同目录,启动日志里面也有写:
虚拟机 /vagrant 
宿主机 /opt/box

#### 虚拟机所有的配置都在这个文件里面:
vim Vagrantfile

#### 取消默认共享:
config.vm.synced_folder ".","/vagrant",disabled:true

#### 共享自定义目录:

config.vm.synced_folder "/opt/box/tmp","/tmp",owner:"root",group:"root",create:true,
mount_options:["dmode=775","fmode=664"]


#### 重启虚拟机查看挂载:
vagrant reload id

#### 配置选项:
config.vm.synced_folder 
"your_folder"(必须) //物理机目录,可以是绝对地址或相对地址,相对地址是指相对与vagrant配置文件所在目录
,"vm_folder(必须)" // 挂载到虚拟机上的目录地址
,create(boolean)--可选 //默认为false,若配置为true,挂载到虚拟机上的目录若不存在则自动创建
,disabled(boolean):--可选 //默认为false,若为true,则禁用该项挂载
,owner(string):'www'--可选 //虚拟机系统下文件所有者(确保系统下有该用户,否则会报错),默认为vagrant
,group(string):'www'--可选 //虚拟机系统下文件所有组( (确保系统下有该用户组,否则会报错),默认为vagrant
,mount_options(array):["dmode=775","fmode=664"]--可选 dmode配置目录权限,fmode配置文件权限 //默认权限777
,type(string):--可选 //指定文件共享方式,例如:'nfs',vagrant默认根据系统环境选择最佳的文件共享方式

## 网络设置:

#### 私网地址:
config.vm.network "public_network",ip:"192.168.3.100"

#### 公网地址:
config.vm.network "public_network",ip:"192.168.3.100"
config.vm.network "public_network",ip:"192.168.3.28"

## 端口设置:

config.vm.network "forwarded_port",guest:80,host:8089
config.vm.network "forwarded_port",guest:8080,host:9090

## 引用外部bash脚本:

config.vm.provision "shell", path: "master_provision.sh"

## 执行命令(provision):

vagrant provision

## 常用命令:

#### 查看已添加的box:
vagrant box list

#### 删除box :
vagrant box remove your_box_name

$ vagrant init # 初始化
$ vagrant up # 启动虚拟机
$ vagrant halt # 关闭虚拟机
$ vagrant reload # 重启虚拟机
$ vagrant ssh # SSH 至虚拟机
$ vagrant global-status # 查看虚拟机运行状态
$ vagrant destroy # 销毁当前虚拟机

## vagrant 视频:

https://ninghao.net/video/1576

## 保存镜像成文件 .box:

#### 1 进入虚拟机里面关闭系统:
sudo su -
init 0

#### 2 确认虚拟机状态变成poweroff(vagrant global-status):

vagrant global-status
id name provider state directory 
-------------------------------------------------------------------------
d9fe29b default virtualbox poweroff /opt/box

上面的state 状态已经变成了poweroff 状态

2.1 确认状态:
#### 进入虚拟机目录执行命令(vagrant status ):

rzxdeMacBook-Pro:box root# vagrant status 
Current machine states:

default poweroff (virtualbox)

The VM is powered off. To restart the VM, simply run `vagrant up`

 

#### 3 执行备份命令:
vagrant package --output /opt/centos65_2017.box

## vagrantfile 里面执行命令或引用外部脚本:

#### 执行命令:
config.vm.provision "shell",inline: <<-SHELL
sudo su -
yum install -y htop nload iftop iotop lsof netstat telnet 
SHELL

#### 执行脚本:

1.1 编写一个bash 脚本并赋予权限:
vim script.sh

#!/bin/bash
echo "this is vagrant bash " > /tmp/data.log


1.2 在Vagratfile 文件里面加内容,脚本放在和Vagrantfile文件同级:
config.vm.provision "shell", path: "script.sh"

1.3 执行命令:
vagrant provision

1.4 验证结果: 
没有啥报错的话,就可以看到 安装信息和bash 脚本运行的结果。 script.sh 这个脚本的运行结果 
vagrant ssh
cat /tmp/data.log

## 我的配置:

Vagrant.configure("2") do |config|
# config.vm.hostname = "master01"
#config.ssh.username = "root"
#config.ssh.password = "123456"
config.vm.box = "centos65"
config.vm.synced_folder "/opt/box/tmp","/tmp",owner:"root",group:"root",create:true,mount_options:["dmode=775","fmode=664"]
#config.vm.synced_folder ".","/vagrant",disabled:true

config.vm.network "forwarded_port",guest:80,host:9090
config.vm.network "public_network",ip:"192.168.3.28"
config.vm.provision "shell",inline: <<-SHELL
sudo su -
yum install -y htop nload iftop iotop lsof netstat telnet
SHELL
config.vm.provision "shell", path: "script.sh"
end

## 错误大全:

#### 问题1 : 
rzxdeMacBook-Pro:~ root# vagrant package --base centos65 --output /opt/centos65_2017.box
==> centos65: VM not created. Moving on...

#### 解决:
去掉"--base"参数就可以解决。 不明白这个参数的具体意义,可能在多虚拟机环境下可以用的到
原文地址:https://www.cnblogs.com/zhenxing06/p/7681147.html