Vagrant系列:Vagrant基本使用入门(2)

简单地说,Provision即通过使用某些工具自动地、批量地为机器安装软件以及配置系统,它省去了人工安装和配置系统时的重复性和易错性,当然还享受了计算机与生俱来的速度。Vagrant提供多种方式对虚拟机进行Provision,包括Shell、Chef、Puppet和Ansible等。以Shell为例,既可以通过直接在Vagrantfile中编写Shell脚本的方式,也可以通过引用外部Shell文件的方式。

直接在Vagrantfile中编写Shell脚本,可以通过“inline”指定脚本内容:

Vagrant.configure("2") do |config|
  # ... other configuration

config.vm.provision "shell", inline: "echo hello"
end

通过引用外部脚本文件的方式:

Vagrant.configure("2") do |config|
  config.vm.provision "shell", path: "script.sh"
end

在使用Ansible时,有两种方式:(1)在Host机器上安装Ansible,(2)采用Ansible Local的方式,即在虚拟机自身上安装Ansible。对于第(1)种方法,我们需要保证Host机器上已经安装了Ansible,然后进行配置:

Vagrant.configure("2") do |config|

#
  # Run Ansible from the Vagrant Host
  #
  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "playbook.yml"
  end

end

在使用第(2)种方法时,Vagrant会首先检查box中是否已经安装了Ansible,如果没有,则会自动安装到虚拟机上,然后再运行provision:

Vagrant.configure("2") do |config|
  # Run Ansible from the Vagrant VM
  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "playbook.yml"
  end
end

当我们多次执行“vagrant up”启动虚拟机时,provison并不会每次都执行,只有在这三种情况下provision才会运行:
1.首次执行vagrant up
2.执行vagrant provision
3.执行vagrant reload --provision

当然,你也可以在Vagrantfile中配置成每次执行vagrant up时都运行provision:

Vagrant.configure("2") do |config|
  config.vm.provision "shell", inline: "echo hello",
    run: "always"
end

(六)网络配置

在默认情况下,对于Virtualbox而言,Vagrant将使用Virtualbox的NAT网络方式,这种方式允许虚拟机访问外部网络,但是不允许外界访问虚拟机,就连Host机器也访问不了。另外,我们可以为虚拟机配置private network和public network。在配置private network时,相当于虚拟机和Host机共同组成了一个单独的局域网,外界无法访问该局域网,但是虚拟机可以访问外界,Host机和虚拟机之间也可以互访。请注意,这里说的外界是指原本和Host处于同一局域网的其他机器。

使用private network时,我们可以给虚拟机指定固定的私有IP:

Vagrant.configure("2") do |config|
  config.vm.network "private_network", ip: "192.168.50.4"
end

当然也可以使用DHCP的方式动态分配IP:

Vagrant.configure("2") do |config|
  config.vm.network "private_network", type: "dhcp"
end

对于Virtualbox而言,此时虚拟机其实有两张网卡在工作,一种是Vagrant默认创建的NAT网卡,另一种是Host only类型的网卡提供private network。

在使用public network时,虚拟机和Host在网络中具有同等的地位(共同使用Host机的物理网卡与外界通信),就相当于在Host所在网络中又多了一台计算机一样,此时虚拟机可以使用网络中的DHCP服务器获得与Host处于同一个网段的IP地址,以下配置默认采用DHCP方式配置public network:

Vagrant.configure("2") do |config|
  config.vm.network "public_network"
end

如果Host机器有多张网卡,此时运行vagrant up, Vagrant会询问需要使用那张网卡连接到网络,如果不想要这种交互,则可以在Vagrantfile中进行配置:

config.vm.network "public_network", bridge: [
  "en1: Wi-Fi (AirPort)",
]

这里的 Wi-Fi(AirPort)表示使用了Mac笔记本的Airport连接到Wi-Fi。

除了DHCP,也可以使用静态IP:

Vagrant.configure("2") do |config|
  config.vm.network "public_network", ip: "192.168.0.5"
end

(七)Provider特定配置

不同的Provider有不同的特性,也存在不同的配置方式。以Virtualbox为例,Vagrant默认会给虚拟机指定一个不具备可读性的名字,比如my-vagrant-project_default_1471685053487_94837,我们可以对此进行配置予以更改:

config.vm.provider "virtualbox" do |v|
  v.name = "my_vm"
end

Provider的特定配置也可以覆盖Vagrant原来的配置:

Vagrant.configure("2") do |config|
  config.vm.box = "precise64"

config.vm.provider "vmware_fusion" do |v, override|
    override.vm.box = "precise64_fusion"
  end
end

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/12878.html