MAC OS系统下Vagrant的安装及使用
1.vagrant安装
安装virtualbox
brew cask install virtualbox
安装vagrant
brew cask install vagrant
重装
brew cask reinstall vagrant
2. vagrant box基本命令
查看本地仓库box列表
vagrant box list
添加box到本地vagrant环境
vagrant box add box-name(box-url) 如(添加centos7包) vagrant box add centos/7
更新本地环境中指定的box
vagrant box update box-name 如 vagrant box update centos/7
删除本地环境中指定的box
vagrant box remove box-name 如 vagrant box remove centos/7
重新打包本地环境中指定的box
vagrant box repackage box-name 如 vagrant box repackage centos/7
3. vagrant基本命令
初始化虚拟机
vagrant init centos/7
编辑Vagrantfile文件
# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| # 选择系统镜像 config.vm.box = "centos/7" config.vm.box_check_update = false config.vm.hostname = "vagrant-centos7" # 时区设置 if Vagrant.has_plugin?("vagrant-timezone") config.timezone.value = "Asia/Shanghai" end # config.vm.network "forwarded_port", guest: 80, host: 8080 # config.vm.network "private_network", ip: "192.168.33.10" # config.vm.network "public_network" # 虚拟机配置 内存 cpu 等 config.vm.provider "virtualbox" do |vb| vb.memory = 2048 vb.cpus = 2 end config.vm.provision "shell", inline: <<-SHELL yum install -y wget net-tools wget -qO /usr/local/bin/jq https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 chmod +x /usr/local/bin/jq SHELL end
启动环境
vagrant up
进入虚拟机(centos7)
vagrant ssh
切换到root用户
sudo su -
退出虚拟机
exit
暂停虚拟机
vagrant suspend
恢复被挂起的虚拟机
vagrant resume
关机
vagrant halt
重新载入配置
vagrant reload
获取虚拟机状态
vagrant status
获取vagrant的版本
vagrant version
销毁当前虚拟机
vagrant destroy
执行脚本
vagrant provision
重新执行脚本
vagrant reload --provision
provisioner 在三种情况下运行:第一次 vagrant up,vagrant provision 和 vagrant reload –provision
Provision脚本
Provisioner 命令:“shell”
示例:
node.vm.provision "shell" do |s| s.inline = <<-SHELL # 更改时区 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime timedatectl set-timezone Asia/Shanghai SHELL
通过 Vagrant Shell 配置程序可以在虚拟机中上传和执行脚本。
Shell 为不熟悉 Chef 或 Puppet 等完整配置管理系统的用户提供了强大的选择。
1. 行内脚本(inline script)
对于单行脚本,可以直接在 Vagrantfile 中指定:
Vagrant.configure("2") do |config| config.vm.provision "shell", inline: "echo Hello, World" end
当虚拟机内的配置程序运行时,会打印 Hello, World。
对于多行脚本,需要标明脚本边界:
Vagrant.configure("2") do |config| node.vm.provision "shell" do |s| s.inline = <<-SHELL # 更改时区 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime timedatectl set-timezone Asia/Shanghai echo 'sync time' SHELL end end
结合一点 Ruby,这使得将多行 shell 脚本直接嵌入到 Vagrantfile 中变得非常简单:
$script = <<-SCRIPT echo I am provisioning... date > /etc/vagrant_provisioned_at SCRIPT Vagrant.configure("2") do |config| config.vm.provision "shell", inline: $script end
上面的内容将脚本分配给全局变量 $script
。这个全局变量包含一个字符串,然后作为内联脚本传递给 Vagrant 配置。
3. 外部脚本
shell 配置程序可以通过路径使用宿主机的脚本。Vagrant 会上传这个脚本到虚拟机并执行。例如:
Vagrant.configure("2") do |config| config.vm.provision "shell", path: "script.sh" end
上面例子中使用的是相对路径,相对于项目的根 Vagrantfile 位置。也可以使用绝对路径,同时还支持 ~
家目录和 ..
父目录。
也可以在 path 参数中通过 URL 来使用远程脚本:
Vagrant.configure("2") do |config| config.vm.provision "shell", path: "https://example.com/provisioner.sh" end
要运行虚拟机上已有的脚本,可以使用内联脚本来调用虚拟机上的远程脚本:
Vagrant.configure("2") do |config| config.vm.provision "shell", inline: "/bin/sh /path/to/the/script/already/on/the/guest.sh" end
4. 脚本参数
可以像任何普通的 shell 脚本一样参数化脚本。这些参数可以指定给 shell 配置程序。参数应该指定为字符串,因为它们将在命令行中键入,因此请确保正确地转义任何内容:
Vagrant.configure("2") do |config| config.vm.provision "shell" do |s| s.inline = "echo $1" s.args = "'hello, world!'" end end
如果不想担心引用的问题,可以将参数指定为数组:
Vagrant.configure("2") do |config| config.vm.provision "shell" do |s| s.inline = "echo $1" s.args = ["hello, world!"] end end
4. 网络配置
Forwarded port(端口映射)
是指将宿主计算机的端口映射到虚拟机上的某个端口上,访问宿主计算机的该端口时,请求实际会被转发到虚拟机上指定的端口,vagrant的配置文件Vagrantfile设置语法为:
config.vm.network :forwarded_port, guest: 80, host: 8889
优点:简单、容易理解、容易实现外网访问虚拟机,永久有效,重启不会丢失。
缺点:需映射很多端口时较麻烦、不支持在宿主机器上使用小于1024的端口来转发(如:不能使用SSL的443端口来进行https连接)。
Private network(私有网络)
这种网络配置下,只有主机可以访问虚拟机,如果多个虚拟机设置定在同一个网段也可以相互访问,当然虚拟机也是可以访问外部网络的。配置语法如下:
config.vm.network "private_network", ip: "192.168.50.4" # 固定IP
还可以设置动态IP,配置语法如下:
config.vm.network "private_network", type: "dhcp"
优点:安全,只能自己访问。
缺点:因私有原有,所以其他团队成员不能和你协作。
Public network(公有网络)
这种配置下,虚拟机享受实体机一样的待遇,一样的网络配置,vagrant 1.3版本以后这种配置也支持设定固定IP,配置语法如下:
config.vm.network "public_network", ip: "192.168.50.4"
还可以设置桥接网卡,配置语法如下:
config.vm.network "public_network", bridge: "en1: Wi-Fi (AirPort)"
优点:方便团队协作,别人可以访问你的虚拟机。
缺点:需要有网络,有路由器分配IP
5.共享目录
有时候,我们希望虚拟机能和我们的主机共享一些文件夹,这时候在vagrant的配置文件中进行配置来达到共享目录的目的。
vagrant的共享目录类型有:
- NFS (适用于Mac OS宿主机), 配置语法:
config.vm.synced_folder "/hostPath", "/guestPath", type: "nfs"
- RSync , 配置语法:
config.vm.synced_folder "/hostPath", "/guestPath", type: "rsync"
- SMB (适用于Windows宿主机), 配置语法:
config.vm.synced_folder "/hostPath", "/guestPath", type: "smb"
- VirtualBox如果你的vagrant使用virtualbox的provider,这是默认的共享目录的类型。这些同步文件夹使用ValualBox共享文件夹系统将文件更改从客户机同步到主机,反之亦然。
6. 虚拟机优化
- 自定义虚拟机名称
config.vm.provider "virtualbox" do |vb| vb.name = "centos-7" end
- 自定义虚拟机主机名称
config.vm.hostname="centos-7"
- 自定义虚拟机内存和CPU
config.vm.provider "virtualbox" do |vb| vb.name = "centos-7" vb.memory = "1024" vb.cpus = 2 end
7. 打包分发
虚拟机打包成Box
vagrant package [--output new_box_name] vagrant package centos7.box