2017-10-07 2 views
0

Mein Ziel ist es, ein Vagrantfile zu erstellen, in dem ich entweder Docker oder VirtualBox mit dem --provider Flag (z. B. vagrant up --provider = virtualbox) wählen kann. Ich habe ein Problem, weil der Docker-Provider sagt, dass meine Box nicht kompatibel ist. Das ist richtig, aber ich möchte nicht, dass Docker diese Box benutzt; Ich habe eine Dockerfile, auf die ich für Docker verweisen kann. Ich möchte, dass die Box nur verwendet wird, wenn VirtualBox der Provider ist. Wie kann ich den Docker-Anbieter veranlassen, die Box-Deklaration zu ignorieren oder die Box-Deklaration nur dann ausführen lassen, wenn VirtualBox der Anbieter ist?Wie schreibt man eine Vagrant-Datei für mehrere Anbieter, die jeweils eine andere Box verwenden?

Das ist mein Vagrantfile:

Vagrant.require_version ">= 1.7.0" 

Vagrant.configure('2') do |config| 
    PROJECT_ROOT = File.expand_path(File.join(File.dirname(File.expand_path(__FILE__)), '..')) 

    config.vm.provider "docker" do |d| 
    d.build_dir = "." 
    d.has_ssh = true 
    end 

    config.vm.box = "ubuntu/trusty64" # <--------- this is the line the Docker provider chokes on 
    config.vm.provider "virtualbox" do |v| 
    v.gui = true 
    end 

    config.vm.network :forwarded_port, guest: 80, host: 9002 
    config.vm.network :forwarded_port, guest: 9000, host: 9000 
    config.vm.network :forwarded_port, guest: 9001, host: 9001 

    config.vm.synced_folder PROJECT_ROOT, '/srv' 

    config.vm.provision :ansible do |ansible| 
    ansible.verbose = "v" 
    ansible.playbook = 'provisioning/playbook.yml' 
    end 
end 

Antwort

1

Sie müssen nur, dass das Feld Zustand bewegen, basierend auf Anbieter

Vagrant.require_version ">= 1.7.0" 

Vagrant.configure('2') do |config| 
    PROJECT_ROOT = File.expand_path(File.join(File.dirname(File.expand_path(__FILE__)), '..')) 

    config.vm.provider "docker" do |d| 
    d.build_dir = "." 
    d.has_ssh = true 
    end 

    config.vm.provider "virtualbox" do |v, override| 
    override.vm.box = "ubuntu/trusty64" 
    v.gui = true 
    end 

    config.vm.network :forwarded_port, guest: 80, host: 9002 
    config.vm.network :forwarded_port, guest: 9000, host: 9000 
    config.vm.network :forwarded_port, guest: 9001, host: 9001 

    config.vm.synced_folder PROJECT_ROOT, '/srv' 

    config.vm.provision :ansible do |ansible| 
    ansible.verbose = "v" 
    ansible.playbook = 'provisioning/playbook.yml' 
    end 
end 
+0

Haben Sie dies auszuführen versuchen? Es funktioniert nicht. 'config.vm.provider' ist keine bedingte Anweisung. Wenn die Datei analysiert wird, sind alle Aufrufe von 'config.vm.provider'. – hekevintran

+1

@hekevintran, überprüfen Sie bitte die aktualisierte Antwort –

+0

Ah gut finden, Override ist die Antwort! Vielen Dank! – hekevintran

0

Das Problem im Grunde kommt es auf die Tatsache, dass Vagrant eine builtin Annahme hat, dass Boxen und Anbieter sind völlig unabhängig und können in beliebiger Kombination ausgetauscht werden. Das ist nicht wahr. Eine Box ist nur mit den Anbietern kompatibel, mit denen sie arbeiten soll. Das richtige Design würde es jedem Anbieter ermöglichen, seine eigene Box zu spezifizieren, anstatt die Box als globalen Wert zu haben. Dieses Design existiert bereits im Docker-Provider, der es Ihnen ermöglicht, ein Docker-Image auszuwählen, das jedoch in keinem anderen Provider existiert. Soweit es mich betrifft, ist dies ein Fehler in Vagrant.

zu Meine Lösung ist, die Anbieter Argument übergeben und wickeln Sie die Anbieter Erklärungen in if-Anweisungen zu analysieren:

require 'optparse' 

def get_provider 
    ret = nil 
    opt_parser = OptionParser.new do |opts| 
    opts.on("--provider provider") do |provider| 
     ret = provider 
    end 
    end 
    opt_parser.parse!(ARGV) 
    ret 
end 
provider = get_provider || "virtualbox" 

PROJECT_ROOT = File.expand_path(File.join(File.dirname(File.expand_path(__FILE__)), '..')) 

Vagrant.require_version ">= 1.7.0" 

Vagrant.configure('2') do |config| 
    if provider == "docker" 
    config.vm.provider "docker" do |d| 
     d.build_dir = "." 
     d.has_ssh = true 
    end 
    end 

    if provider == "virtualbox" 
    config.vm.box = "ubuntu/trusty64" 
    config.vm.provider "virtualbox" do |v| 
     v.gui = true 
    end 
    end 

    config.vm.network :forwarded_port, guest: 80, host: 9002 
    config.vm.network :forwarded_port, guest: 9000, host: 9000 
    config.vm.network :forwarded_port, guest: 9001, host: 9001 

    config.vm.synced_folder PROJECT_ROOT, '/srv' 

    config.vm.provision :ansible do |ansible| 
    ansible.verbose = "v" 
    ansible.playbook = 'provisioning/playbook.yml' 
    end 
end 
Verwandte Themen