2013-06-12 21 views
7

Ich habe eine Vagrant-Datei, die eine lokale VM erstellt. Ich möchte den EC2-Provider hinzufügen und entweder eine lokale VM bereitstellen oder eine auf EC2.Mehrere Anbieter in einer einzelnen vagabundierenden Datei?

Kann ich Konfigurationen für mehrere Anbieter in der gleichen Vagrantfile erstellen und irgendwie wählen, was ich ausführen soll, wenn ich vagrant up mache?

+1

Es ist zu beachten, dass der Begriff "Provisioner" in diesem Zusammenhang falsch ist. Es sollte "Provider" genannt werden - aber ich will hier nicht in einen Edit-Krieg einsteigen. – ChrisWue

Antwort

7

Sie können eine multi-vm-Umgebung verwenden, in der jede VM mit einem anderen Anbieter bereitgestellt werden kann und Sie auf der Befehlszeile auswählen können, welche Sie vagrant up <machine> möchten.

+0

OK Danke, daran hatte ich nicht gedacht. – jbrown

+2

Für zukünftige Leser: Ich habe die Frage bearbeitet, um sie "Provider" anstatt "Provisioner" zu nennen. – Peeja

+0

Beachten Sie, dass nicht mehrere Anbieter gleichzeitig ausgeführt werden können. In diesem Fall müssen Sie die Multi-Computer-Umgebung verwenden. – mehmet

0

Von the Vagrant docs:

Multiple config.vm.provision Methoden können mehrere Versorger zu definieren, verwendet werden. Diese Provisioner werden in der Reihenfolge ausgeführt, in der sie definiert wurden.

zB .: erste Puppe in der Maschine installieren und dann einige Puppe laufen manifestiert:

 

    $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 Second shell provisioner" 

+2

die Frage war über mehrere "Provider" nicht "Provisioner" – rravuri

+1

Die Frage wurde ursprünglich über Provisioner gefragt und dann bearbeitet, um nach Anbietern zu fragen. – hekevintran

1

auszuführen VM lokal können Sie ausführen: vagrant up --provider=virtualbox und wenn Sie möchten, dass VM laufen Wenn Sie einen anderen Anbieter verwenden, können Sie Folgendes verwenden: vagrant up --provider=aws

Denken Sie jedoch daran, dass Sie das entsprechende Provider-Plug-in installieren müssen, bevor Sie es verwenden.

4

Add-Box für jeden Anbieter

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

und Ihre Vagrantfile sollte so aussehen

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 

dann auf jedem Provider erstellen folgenden Befehle

> vagrant up --provider=virtualbox 
> vagrant up --provider=vmware_fusion 
0

Bitte diese gist posted by @tknerr überprüfen, die funktioniert mit allen Anbietern wie virtualbox, AWS und combin verwaltet mit dem Vagrant-Omnibus-Plugin. Hier ist der Code von 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 
0

Sie können wählen, welche Anbieter Sie von --provider Parameter ausgeführt werden soll.

Hier Code Rubin in Vagrantfile, die je unterschiedliche VM ausgeführt werden kann, welcher Anbieter die Sie gewählt haben:

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 

So von der Standardanbieter VirtualBox ist, aber Sie können von der Kommandozeile, wie angeben:

vagrant up --provider=aws 
0

Ja, Sie mehrere Maschinen unter Verwendung des config.vm.define Methodenaufruf zum Beispiel angeben:

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 

Siehe: Defining multiple machines at Vagranup Docs und Providers

Verwandte Themen