2015-01-14 42 views
1

我們開始使用Vagrant來設置我們的開發環境。 現在我們還想在生產/分期中使用相同的Vagrantfile。開發和生產的無用供應

當我使用一個包含VirtualBox的供應商和GCE一樣vagrantfile我得到的錯誤

An active machine was found with a different provider. Vagrant 
currently allows each machine to be brought up with only a single 
provider at a time. A future version will remove this limitation. 
Until then, please destroy the existing machine to up with a new 
provider. 

Machine name: default 
Active provider: virtualbox 
Requested provider: google 

有沒有一種方法可以讓我漂泊不定了VirtualBox和GCE?

Vagrant.has_plugin?("nugrant") 
Vagrant.require_version ">= 1.6.3" 

Vagrant.configure("2") do |config| 
    config.vm.provider "virtualbox" 
    config.vm.box = "yungsang/boot2docker" 

    config.vm.provider :google do |google, override| 
    override.vm.box = "gce"  
    google.google_project_id = $GOOGLE_PROJECT_ID 
    google.google_client_email = $GOOGLE_CLIENT_EMAIL 
    google.google_key_location = $GOOGLE_KEY_LOCATION 

    # Override provider defaults 
    google.name = "name" 
    google.image = "ubuntu-1404-trusty-v20141212" 
    google.machine_type = "n1-standard-1" 
    google.zone = "europe-west1-c" 
    google.metadata = {'custom' => 'metadata', 'production' => 'app'} 
    google.tags = ['vagrantbox', 'prod'] 

    override.ssh.username = $LOCAL_USER 
    override.ssh.private_key_path = $LOCAL_SSH_KEY 

    config.vm.define :prod do |prod| 
     prod.vm.provision :shell, inline: 'echo I am executed in prod only!!' 
    end 
    end 

    config.vm.synced_folder ".", "/vagrant" 

    # Fix busybox/udhcpc issue 
    config.vm.provision :shell do |s| 
    s.inline = <<-EOT 
     if ! grep -qs ^nameserver /etc/resolv.conf; then 
     sudo /sbin/udhcpc 
     fi 
     cat /etc/resolv.conf 
    EOT 
    end 

    # Adjust datetime after suspend and resume 
    config.vm.provision :shell do |s| 
    s.inline = <<-EOT 
     sudo /usr/local/bin/ntpclient -s -h pool.ntp.org 
     date 
    EOT 
    end 

    # Login docker hub 
    config.vm.provision :shell do |s| 
    s.inline = "/usr/bin/docker [email protected]" 
    s.args = ["login", "-u", config.user.docker.username, "-p", config.user.docker.password, "-e", config.user.docker.email] 
    end 

    config.vm.provision :docker do |d|  
    d.pull_images "nginx" 
    d.pull_images "mongodb" 
    d.pull_images "java"  
    end 

    ACTICE_SPRING_PROFILE = "te" 

    config.vm.provision :docker do |d| 
    # provision docker stuff here 
    end 

    config.vm.network "forwarded_port", guest: 80, host: 8080 
    config.vm.network "forwarded_port", guest: 443, host: 8443 
end 

更新:

我試圖解決與多虛擬機設置的問題,但現在我面臨着流浪者使用一個外到內配置的問題,所以我GCE特定腳本像gce.vm.provision :shell, inline: 'curl -sSL https://get.docker.com/ubuntu/ | sudo sh'在最後執行不是在開始。

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

    config.vm.define "dev", primary: true do |dev|  
    dev.vm.provider "virtualbox" 
    dev.vm.box = "yungsang/boot2docker" 

    dev.vm.synced_folder ".", "/vagrant" 

    override.vm.provision :shell, inline: 'echo "Provision DEV"' 
    # Fix busybox/udhcpc issue 
    dev.vm.provision :shell do |s| 
     s.inline = <<-EOT 
     if ! grep -qs ^nameserver /etc/resolv.conf; then 
      sudo /sbin/udhcpc 
     fi 
     cat /etc/resolv.conf 
     EOT 
    end 

    # Adjust datetime after suspend and resume 
    dev.vm.provision :shell do |s| 
     s.inline = <<-EOT 
     sudo /usr/local/bin/ntpclient -s -h pool.ntp.org 
     date 
     EOT 
    end 

    dev.vm.network "forwarded_port", guest: 80, host: 8080 
    dev.vm.network "forwarded_port", guest: 443, host: 8443 
    end 

    config.vm.define "gce", autostart: false do |gce|  
    gce.vm.provider :google do |google, override| 
     override.vm.box = "gce" 
     google.google_project_id = $GOOGLE_PROJECT_ID 
     google.google_client_email = $GOOGLE_CLIENT_EMAIL 
     google.google_key_location = $GOOGLE_KEY_LOCATION 

     # Override provider defaults 
     google.name = "z-rechnung-#{TARGET_ENV}" 
     google.image = "ubuntu-1404-trusty-v20141212" 
     google.machine_type = "n1-standard-1" 
     google.zone = "europe-west1-c" 
     google.metadata = {'environment' => "#{TARGET_ENV}"} 
     google.tags = ['vagrantbox', "#{TARGET_ENV}"] 

     override.ssh.username = $LOCAL_USER 
     override.ssh.private_key_path = $LOCAL_SSH_KEY 

     gce.vm.provision :shell, inline: 'sudo apt-get update -y' 
     gce.vm.provision :shell, inline: 'sudo apt-get upgrade -y' 
     gce.vm.provision :shell, inline: 'curl -sSL https://get.docker.com/ubuntu/ | sudo sh' 
    end 
    end 

    # Login docker hub 
    config.vm.provision :shell do |s| 
    s.inline = "/usr/bin/docker [email protected]" 
    s.args = ["login", "-u", config.user.docker.username, "-p", config.user.docker.password, "-e", config.user.docker.email] 
    end 

    config.vm.provision :docker do |d|  
    d.pull_images .... 
    end 

    config.vm.provision :docker do |d| 
    d.run "image" .... 
    end 
+0

可能使用[使用Vagrant管理開發和生產環境?](http://stackoverflow.com/questions/18724275/using-vagrant-to-manage-development-and-production-environments) – kenorb

回答

0

正確的答案是要記住,你Vagrantfile只是一個Ruby程序,首先,這個程序的執行是導致數據結構的CLI子命令遍歷。

因此,創建將配置器添加到配置的函數,然後在「內部」中調用它們。例如,

def provisioner_one(config) 
    config.vm.provision :shell, 'echo hello' 
end 

Vagrant.configure('2') do |config| 
    # stuff here 
    config.vm.define 'dev' do |dev, override| 
     # whatever else here 

     provisioner_one(dev) 

     # other stuff here 
    end 
    # more other stuff here 
end 

這將DWIM。