单个Vagrant文件中使用多个提供程序?

9
我有一个vagrant文件,用于构建本地虚拟机。我想添加EC2提供程序,并且可以选择在本地虚拟机上或EC2上进行配置。
我能否在同一个Vagrantfile中为多个提供程序创建配置,并在执行vagrant up时选择要运行的提供程序?

1
应该注意,在这个上下文中,“provisioner”这个术语是错误的。它应该被称为“provider” - 但我不想在这里卷入编辑战。 - ChrisWue
7个回答

9
您可以使用多虚拟机环境,每个虚拟机都可以使用不同的提供程序进行配置,您可以在命令行中选择要启动的虚拟机并使用vagrant up <machine>命令。

2
对于未来的读者:我已经编辑了问题,将它们称为“提供者”而不是“供应商”。 - Peeja
请注意,您不能同时运行多个提供程序。在这种情况下,您必须使用多机环境。 - mehmet

7

为每个提供商添加一个框

> vagrant box add precise64 http://file.vagrantup.com/precise64.box
> vagrant box add precise64 http://file.vagrantup.com/precise64_vmware_fusion.box

你的Vagrantfile应该长成这个样子

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

  config.vm.provider "virtualbox" do |v|
    v.customize ["modifyvm", :id, "--memory", "2048"]
  end

  config.vm.provider "vmware_fusion" do |v|
    v.vmx["memsize"] = "2048"
  end
end

然后使用以下命令在每个提供商上创建:
> vagrant up --provider=virtualbox
> vagrant up --provider=vmware_fusion

2

您可以通过--provider参数选择要运行的提供商。

这是在Vagrantfile中的Ruby代码,可以根据您选择的提供商运行不同的虚拟机:

require 'getoptlong'

# Parse CLI arguments.
opts = GetoptLong.new(
  [ '--provider',     GetoptLong::OPTIONAL_ARGUMENT ],
)

provider='virtualbox'
begin
  opts.each do |opt, arg|
    case opt
      when '--provider'
        provider=arg
    end # case
  end # each
  rescue
end

# Vagrantfile API/syntax version.
Vagrant.configure(2) do |config|

  config.vm.hostname = "vagrant"
  config.vm.define "default-#{provider}"

  config.vm.provider "virtualbox" do |vbox, override|
    vbox.customize ['modifyvm', :id, '--natdnshostresolver1', 'on']
    vbox.name = "test.local"
    override.vm.box = "ubuntu/wily64"
    override.vm.network "private_network", ip: "192.168.22.22"
  end

  config.vm.provider :aws do |aws, override|
    aws.ami = "ami-7747d01e"
    aws.instance_type = "m3.medium"
    override.vm.box = "dummy"
    override.vm.box_url = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box"
    override.ssh.username = "ubuntu"
  end

end

默认提供程序是虚拟机,但您可以通过命令行指定,例如:

vagrant up --provider=aws 

1
请查看由@tknerr发布的gist,它适用于所有提供商,例如virtualbox、AWS和与vagrant-omnibus插件结合使用的托管。这是来自Vagrantfile的代码:
#
# Vagrantfile for testing
#
Vagrant::configure("2") do |config|

  # the Chef version to use
  config.omnibus.chef_version = "11.4.4"

  def configure_vbox_provider(config, name, ip, memory = 384)
    config.vm.provider :virtualbox do |vbox, override| 
      # override box url
      override.vm.box = "opscode_ubuntu-13.04_provisionerless"
      override.vm.box_url = "https://opscode-vm.s3.amazonaws.com/vagrant/opscode_ubuntu-13.04_provisionerless.box"
      # configure host-only network
      override.vm.hostname = "#{name}.local"
      override.vm.network :private_network, ip: ip
      # enable cachier for local vbox vms
      override.cache.auto_detect = true

      # virtualbox specific configuration
      vbox.customize ["modifyvm", :id, 
        "--memory", memory,
        "--name", name
      ] 
    end
  end

  def configure_aws_provider(config)
    config.vm.provider :aws do |aws, override|
      # use dummy box
      override.vm.box = "aws_dummy_box"
      override.vm.box_url = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box"
      # override ssh user and private key
      override.ssh.username = "ubuntu"
      override.ssh.private_key_path = "#{ENV['HOME']}/.ssh/mccloud_rsa"

      # aws specific settings
      aws.access_key_id = "XXXX"
      aws.secret_access_key = "XXXXX"
      aws.ami = "ami-524e4726"
      aws.region = "eu-west-1"
      aws.availability_zone = "eu-west-1c"
      aws.instance_type = "m1.small"
      aws.security_groups = [ "mccloud", "http" ]
      aws.keypair_name = "mccloud-key-tlc"
    end
  end

  def configure_managed_provider(config, server)
    config.vm.provider :managed do |managed, override|
      # use dummy box
      override.vm.box = "managed_dummy_box"
      override.vm.box_url = "https://github.com/tknerr/vagrant-managed-servers/raw/master/dummy.box"

      # link with this server
      managed.server = server
    end
  end

#
# define a separate VMs for the 3 providers (vbox, aws, managed) 
# because with Vagrant 1.2.2 you can run a VM with only one provider at once
#
[:aws, :vbox, :esx].each do |provider|
  #
  # Sample VM per provider
  #
  config.vm.define :"sample-app-#{provider}" do | sample_app_config |

    case provider
    when :vbox
      configure_vbox_provider(sample_app_config, "sample-app", "33.33.40.10")
    when :aws
      configure_aws_provider(sample_app_config)
    when :esx    
      configure_managed_provider(sample_app_config, "33.33.77.10")  
    end

    sample_app_config.vm.provision :chef_solo do |chef|
      chef.cookbooks_path = [ './cookbooks/sample-app-0.1.0' ]
      chef.add_recipe "sample-app"
      chef.json = {
        :sample_app => {
          :words_of_wisdom => "Vagrant on #{provider} Rocks!"
        }
      }
    end
  end
end

end

1
要在本地运行虚拟机,您可以运行: vagrant up --provider=virtualbox 如果您想使用不同的提供程序运行虚拟机,则可以使用: vagrant up --provider=aws 但请记住,在使用之前,您必须安装适当的提供程序插件。

-1

是的,您可以使用config.vm.define方法调用来指定多台机器,例如:

Vagrant.configure("2") do |config|
  config.vm.provision "shell", inline: "echo Hello"

  config.vm.define "web" do |web|
    web.vm.box = "apache"
  end

  config.vm.define "db" do |db|
    db.vm.box = "mysql"
  end
end

请参见:在Vagranup文档中定义多台机器提供程序


-1

来自Vagrant文档

可以使用多个config.vm.provision方法定义多个provisioner。这些provisioner将按照它们被定义的顺序运行。

例如: 在机器中首先安装puppet,然后运行一些puppet清单:

    $script = "
    wget http://apt.puppetlabs.com/puppetlabs-release-precise.deb
    sudo dpkg -i puppetlabs-release-precise.deb
    sudo apt-get update
    sudo aptitude -yy install puppet
    "
config.vm.provision "shell", inline: $script
config.vm.provision "puppet" do |puppet| puppet.manifests_path = "manifest/puppet" puppet.manifest_file = "init.pp" end
config.vm.provision "shell", inline: "echo 第二个shell provisioner"

2
问题是关于多个“提供者”,而不是“供应商”的。 - rravuri
1
这个问题最初是关于供应商的,然后被编辑为询问提供者。 - hekevintran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接