MAC OS系统下Vagrant的安装及使用

By prince No comments

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

 

发表评论

 

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据