vaguerent/lib/vagrant/action/vm/provision.rb
James Turnbull 6548bc9324 Adds a basic Puppet provisioner to Vagrant
This uses the Puppet binary and assumes a .pp file will be present
on the host machine.

By default it looks for manifests in the `manifests` directory (in the same root as
wherever your Vagrantfile is located). The default file uses the name of the box
being configured, for example `lucid.pp`.  Both options are configurable.
2010-12-07 16:57:00 -08:00

53 lines
1.6 KiB
Ruby

module Vagrant
class Action
module VM
class Provision
def initialize(app, env)
@app = app
@env = env
@env["provision.enabled"] = true if !@env.has_key?("provision.enabled")
load_provisioner if provisioning_enabled?
end
def call(env)
@app.call(env)
if provisioning_enabled?
@env.ui.info I18n.t("vagrant.actions.vm.provision.beginning")
@provisioner.provision!
end
end
def provisioning_enabled?
!@env["config"].vm.provisioner.nil? && @env["provision.enabled"]
end
def load_provisioner
provisioner = @env["config"].vm.provisioner
if provisioner.is_a?(Class)
@provisioner = provisioner.new(@env)
raise Errors::ProvisionInvalidClass.new if !@provisioner.is_a?(Provisioners::Base)
elsif provisioner.is_a?(Symbol)
# We have a few hard coded provisioners for built-ins
mapping = {
:chef_solo => Provisioners::ChefSolo,
:chef_server => Provisioners::ChefServer,
:puppet => Provisioners::Puppet
}
provisioner_klass = mapping[provisioner]
raise Errors::ProvisionUnknownType.new(:provisioner => provisioner.to_s) if provisioner_klass.nil?
@provisioner = provisioner_klass.new(@env)
end
@env.ui.info I18n.t("vagrant.actions.vm.provision.enabled", :provisioner => @provisioner.class.to_s)
@provisioner.prepare
@provisioner
end
end
end
end
end