Class: Vagrant::Provisioners::Puppet

Inherits:
Base
  • Object
show all
Defined in:
lib/vagrant/provisioners/puppet.rb

Defined Under Namespace

Classes: Config

Instance Attribute Summary

Attributes inherited from Base

#config, #env

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

#cleanup

Constructor Details

#initialize(env, config) ⇒ Puppet

Returns a new instance of Puppet.



74
75
76
77
78
# File 'lib/vagrant/provisioners/puppet.rb', line 74

def initialize(env, config)
  super

  @logger = Log4r::Logger.new("vagrant::provisioners::puppet")
end

Class Method Details

.config_classObject



70
71
72
# File 'lib/vagrant/provisioners/puppet.rb', line 70

def self.config_class
  Config
end

Instance Method Details

#manifests_guest_pathObject



126
127
128
# File 'lib/vagrant/provisioners/puppet.rb', line 126

def manifests_guest_path
  File.join(config.pp_path, "manifests")
end

#prepareObject



80
81
82
83
84
85
86
87
88
89
# File 'lib/vagrant/provisioners/puppet.rb', line 80

def prepare
  # Calculate the paths we're going to use based on the environment
  @expanded_manifests_path = config.expanded_manifests_path(env[:root_path])
  @expanded_module_paths   = config.expanded_module_paths(env[:root_path])
  @manifest_file           = File.join(manifests_guest_path, config.manifest_file)

  set_module_paths
  share_manifests
  share_module_paths
end

#provision!Object



91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/vagrant/provisioners/puppet.rb', line 91

def provision!
  # Check that the shared folders are properly shared
  check = [manifests_guest_path]
  @module_paths.each do |host_path, guest_path|
    check << guest_path
  end

  verify_shared_folders(check)

  # Verify Puppet is installed and run it
  verify_binary("puppet")
  run_puppet_client
end

#run_puppet_clientObject



137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/vagrant/provisioners/puppet.rb', line 137

def run_puppet_client
  options = [config.options].flatten
  module_paths = @module_paths.map { |_, to| to }
  options << "--modulepath '#{module_paths.join(':')}'" if !@module_paths.empty?
  options << @manifest_file
  options = options.join(" ")

  # Build up the custom facts if we have any
  facter = ""
  if !config.facter.empty?
    facts = []
    config.facter.each do |key, value|
      facts << "FACTER_#{key}='#{value}'"
    end

    facter = "#{facts.join(" ")} "
  end

  command = "cd #{manifests_guest_path} && #{facter}puppet apply #{options} --detailed-exitcodes || [ $? -eq 2 ]"

  env[:ui].info I18n.t("vagrant.provisioners.puppet.running_puppet",
                       :manifest => @manifest_file)

  env[:vm].channel.sudo(command) do |type, data|
    env[:ui].info(data.chomp, :prefix => false)
  end
end

#set_module_pathsObject



119
120
121
122
123
124
# File 'lib/vagrant/provisioners/puppet.rb', line 119

def set_module_paths
  @module_paths = []
  @expanded_module_paths.each_with_index do |path, i|
    @module_paths << [path, File.join(config.pp_path, "modules-#{i}")]
  end
end

#share_manifestsObject



105
106
107
# File 'lib/vagrant/provisioners/puppet.rb', line 105

def share_manifests
  env[:vm].config.vm.share_folder("manifests", manifests_guest_path, @expanded_manifests_path)
end

#share_module_pathsObject



109
110
111
112
113
114
115
116
117
# File 'lib/vagrant/provisioners/puppet.rb', line 109

def share_module_paths
  count = 0
  @module_paths.each do |from, to|
    # Sorry for the cryptic key here, but VirtualBox has a strange limit on
    # maximum size for it and its something small (around 10)
    env[:vm].config.vm.share_folder("v-pp-m#{count}", to, from)
    count += 1
  end
end

#verify_binary(binary) ⇒ Object



130
131
132
133
134
135
# File 'lib/vagrant/provisioners/puppet.rb', line 130

def verify_binary(binary)
  env[:vm].channel.sudo("which #{binary}",
                        :error_class => PuppetError,
                        :error_key => :not_detected,
                        :binary => binary)
end

#verify_shared_folders(folders) ⇒ Object



165
166
167
168
169
170
171
172
# File 'lib/vagrant/provisioners/puppet.rb', line 165

def verify_shared_folders(folders)
  folders.each do |folder|
    @logger.debug("Checking for shared folder: #{folder}")
    if !env[:vm].channel.test("test -d #{folder}")
      raise PuppetError, :missing_shared_folders
    end
  end
end