【问题标题】:vagrant provision for dev and production为开发和生产提供流浪者
【发布时间】:2015-01-14 09:24:54
【问题描述】:

我们开始使用 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 $@"
    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

更新:

我尝试通过多虚拟机设置来解决问题,但现在我面临 vagrant 使用 outside-in 配置的问题,因此我的 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 $@"
    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

【问题讨论】:

标签: vagrant


【解决方案1】:

正确的答案是记住,首先,你的 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。

【讨论】:

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