【问题标题】:Multiple providers in a single vagrant file?一个流浪文件中有多个提供者?
【发布时间】:2013-06-12 07:32:47
【问题描述】:

我有一个构建本地 VM 的 vagrant 文件。我想添加 EC2 提供程序,并可以选择在 EC2 上配置本地 VM 或一个。

我可以在同一个 Vagrantfile 中为多个提供程序创建配置,并在我执行 vagrant up 时以某种方式选择要运行的配置吗?

【问题讨论】:

  • 应该注意,术语“provisioner”在这种情况下是错误的。它应该被称为“提供者”——但我不想在这里卷入编辑战

标签: vagrant vagrantfile


【解决方案1】:

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

这是Vagrantfile 中的 ruby​​ 代码,它可以运行不同的 VM,具体取决于您选择的提供商:

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

所以默认提供者是virtualbox,但是你可以从命令行指定,比如:

vagrant up --provider=aws 

【讨论】:

    【解决方案2】:

    请检查此gist posted by @tknerr,它适用于所有提供商,例如 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
    

    【讨论】:

      【解决方案3】:

      为每个提供者添加框

      > 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
      

      【讨论】:

        【解决方案4】:

        您可以使用multi-vm 环境,其中每个虚拟机都可以使用不同的提供程序进行配置,并且您可以在命令行上选择要使用哪个vagrant up <machine>

        【讨论】:

        • 对于未来的读者:我已将问题编辑为称他们为“提供者”而不是“供应者”。
        • 请注意,您不能同时运行多个提供程序。在这种情况下,您必须使用多机环境。
        【解决方案5】:

        来自the Vagrant docs

        可以使用多个 config.vm.provision 方法来定义多个配置器。这些配置程序将按照它们定义的顺序运行。

        例如: 首先在机器上安装 puppet,然后运行一些 puppet manifests:

        $脚本 = " wget http://apt.puppetlabs.com/puppetlabs-release-precise.deb sudo dpkg -i puppetlabs-release-precise.deb sudo apt-get 更新 sudo aptitude -yy 安装木偶 " config.vm.provision “外壳”,内联:$script config.vm.provision "puppet" 做 |puppet| puppet.manifests_path = "清单/木偶" puppet.manifest_file = "init.pp" 结尾 config.vm.provision "shell", inline: "echo Second shell provisioner"

        【讨论】:

        • 问题是关于多个“供应商”而不是“供应商”
        • 这个问题最初是关于供应商的,然后被编辑为询问供应商。
        【解决方案6】:

        可以,可以通过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
        

        请参阅:Defining multiple machines at Vagranup DocsProviders

        【讨论】:

          【解决方案7】:

          要在本地运行 VM,您可以运行: vagrant up --provider=virtualbox 如果您想使用不同的提供程序运行 VM,那么您可以使用: vagrant up --provider=aws

          但是,请记住,您必须先安装适当的提供程序插件,然后才能使用它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-09-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多