2013-06-12 6 views
7

J'ai un fichier vagabond qui construit une VM locale. Je veux ajouter le fournisseur EC2 et avoir la possibilité de provisionner une VM locale ou une provision sur EC2. Puis-je créer des configs pour plusieurs fournisseurs dans le même fichier Vagrantfile et choisir d'une manière ou d'une autre à exécuter vagrant up?Plusieurs fournisseurs dans un seul fichier vagabond?

+1

Il convient de noter que le terme « approvisionneur » ne va pas dans ce contexte. Il devrait être appelé "fournisseur" - mais je ne veux pas entrer dans une guerre d'édition ici – ChrisWue

Répondre

7

Vous pouvez utiliser un environnement multi-vm, où chaque VM peut être configurée avec un fournisseur différent et vous pouvez choisir sur la ligne de commande celle que vous voulez vagrant up <machine>.

+0

OK merci, je n'avais pas pensé à cela. – jbrown

+2

Pour les futurs lecteurs: J'ai modifié la question pour les appeler «fournisseurs» plutôt que «fournisseurs». – Peeja

+0

Notez simplement que vous ne pouvez pas avoir plusieurs fournisseurs en cours d'exécution en même temps. Dans ce cas, vous devez utiliser un environnement multi-machine. – mehmet

0

De the Vagrant docs:

méthodes de config.vm.provision multiples peuvent être utilisés pour définir plusieurs approvisionneurs. Ces fournisseurs seront exécutés dans l'ordre dans lequel ils sont définis.

.: par exemple d'abord installer la marionnette dans la machine et puis exécutez une marionnette manifeste:

 

    $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

la question concernait plusieurs 'fournisseurs' et non 'fournisseurs' – rravuri

+1

La question a été posée à l'origine à propos des fournisseurs, puis éditée pour poser des questions sur les fournisseurs. – hekevintran

1

Pour exécuter VM vous pouvez exécuter localement: vagrant up --provider=virtualbox et si vous voulez exécuter VM en utilisant un fournisseur différent, vous pouvez utiliser: vagrant up --provider=aws

Toutefois, n'oubliez pas que vous devez installer le plugin fournisseur approprié avant de l'utiliser.

4

boîte ajouter pour chaque fournisseur

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

et votre Vagrantfile devrait ressembler à

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 

puis créer sur chaque fournisseur en utilisant les commandes suivantes

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

S'il vous plaît vérifier ce gist posted by @tknerr qui fonctionne avec tous les fournisseurs tels que virtualbox, AWS et géré en combinaison avec le plugin vagabond-omnibus. Voici le code de 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

Vous pouvez choisir quel fournisseur vous souhaitez exécuter par --provider paramètre.

est le code rubis Ici Vagrantfile qui peut exécuter différentes VM en fonction de quel fournisseur vous avez choisi:

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 

donc par le fournisseur par défaut est VirtualBox, mais vous pouvez spécifier à partir de la ligne de commande, comme:

vagrant up --provider=aws 
0

Oui, vous pouvez spécifier plusieurs machines en utilisant l'appel de méthode config.vm.define, par exemple:

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 

Voir: Defining multiple machines at Vagranup Docs et Providers

Questions connexes