Class: ShadowPuppet::Manifest

Inherits:
Object
  • Object
show all
Defined in:
lib/shadow_puppet/test.rb,
lib/shadow_puppet/manifest.rb

Overview

A Manifest is an executable collection of Puppet Resources.

===Example

class ManifestExample < ShadowPuppet::Manifest
recipe :sample
recipe :lamp, :ruby               # queue calls to self.lamp and
                                  # self.ruby when executing

recipe :mysql, {                  # queue a call to self.mysql
  :root_password => 'OMGSEKRET'   # passing the provided hash
}                                 # as an option

def sample
  exec :foo, :command => 'echo "foo" > /tmp/foo.txt'

  package :foo, :ensure => :installed

  file '/tmp/example.txt',
    :ensure   => :present,
    :contents => Facter.to_hash_inspect,
    :require  => package(:foo)
end

def lamp
  #install a basic LAMP stack
end

def ruby
  #install a ruby interpreter and tools
end

def mysql(options)
   #install a mysql server and set the root password to options[:root_password]
end

end

To execute the above manifest, instantiate it and call execute on it:

m = ManifestExample.new
m.execute

As shown in the sample method in ManifestExample above, instance methods are created for each Puppet::Type available on your system. These methods behave identally to the Puppet Resources methods. See here for documentation on these methods.

To view a list of all defined methods on your system, run:

ruby -rubygems -e 'require "shadow_puppet";puts ShadowPuppet::Manifest.puppet_type_methods'

The use of methods (+sample+, lamp, ruby, and mysql above) as a container for resources facilitates recipie re-use through the use of Ruby Modules. For example:

module ApachePuppet
# Required options:
#   domain
#   path
def php_vhost(options)
  #...
end
end

class MyWebMainfest < ShadowPuppet::Manifest
include ApachePuppet
recipe :php_vhost, {
  :domain => 'foo.com',
  :path => '/var/www/apps/foo'
}
end

Direct Known Subclasses

Setup

Defined Under Namespace

Classes: Setup

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config = {}) ⇒ Manifest

Initialize a new instance of this manifest. This can take a config hash, which is immediately passed on to the configure method



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/shadow_puppet/manifest.rb', line 85

def initialize(config = {})
  if Process.uid == 0
    Puppet[:confdir] = File.expand_path("/etc/shadow_puppet")
    Puppet[:vardir] = File.expand_path("/var/shadow_puppet")
  else
    Puppet[:confdir] = File.expand_path("~/.shadow_puppet")
    Puppet[:vardir] = File.expand_path("~/.shadow_puppet/var")
  end
  Puppet[:user] = Process.uid
  Puppet[:group] = Process.gid
  Puppet::Util::Log.newdestination(:console)

  configure(config)
  @executed = false
  @puppet_resources = Hash.new do |hash, key|
    hash[key] = {}
  end
end

Instance Attribute Details

#puppet_resourcesObject (readonly)

Returns the value of attribute puppet_resources.



78
79
80
# File 'lib/shadow_puppet/manifest.rb', line 78

def puppet_resources
  @puppet_resources
end

Class Method Details

.configurationObject

A hash describing any configuration that has been performed on the class. Modify this hash by calling configure:

class SampleManifest < ShadowPuppet::Manifest
configure(:name => 'test')
end

>> SampleManifest.configuration
=> {:name => 'test'}

All keys on this hash are coerced into symbols for ease of access.

Subclasses of the Manifest class properly inherit the parent classes' configuration.



136
137
138
# File 'lib/shadow_puppet/manifest.rb', line 136

def self.configuration
  __config__.deep_symbolize_keys
end

.configure(hash) ⇒ Object

Define configuration on this manifest. This is useful for storing things such as hostnames, password, or usernames that may change between different implementations of a shared manifest. Access this hash by calling configuration:

class SampleManifest < ShadowPuppet::Manifest
configure('name' => 'test')
end

>> SampleManifest.configuration
=> {:name => 'test'}

All keys on this hash are coerced into symbols for ease of access.

Subsequent calls to configure perform a deep_merge of the provided hash into the pre-existing configuration.



168
169
170
# File 'lib/shadow_puppet/manifest.rb', line 168

def self.configure(hash)
  __config__.deep_merge!(hash)
end

.puppet_type_methodsObject

An array of all methods defined for creation of Puppet Resources



187
188
189
# File 'lib/shadow_puppet/manifest.rb', line 187

def self.puppet_type_methods
  Puppet::Type.eachtype { |t| t.name }.keys.map { |n| n.to_s }.sort.inspect
end

.recipe(*methods) ⇒ Object

Declares that the named method or methods will be called whenever execute is called on an instance of this class. If the last argument is a Hash, this hash is passed as an argument to all provided methods. If no options hash is provided, each method is passed the contents of configuration.

Subclasses of the Manifest class properly inherit the parent classes' calls to recipe.



112
113
114
115
116
117
118
119
120
# File 'lib/shadow_puppet/manifest.rb', line 112

def self.recipe(*methods)
  return nil if methods.nil? || methods == []
  options = methods.extract_options!
  methods.each do |meth|
    options = configuration[meth.to_sym] if options == {}
    options ||= {}
    recipes << [meth.to_sym, options]
  end
end

.register_puppet_typesObject

Create an instance method for every type that either creates or references a resource



197
198
199
200
201
202
203
204
205
206
207
208
209
210
# File 'lib/shadow_puppet/manifest.rb', line 197

def self.register_puppet_types
  Puppet::Type.loadall
  Puppet::Type.eachtype do |type|
    #remove the method rdoc placeholders
    remove_method(type.name) rescue nil
    define_method(type.name) do |*args|
      if args && args.flatten.size == 1
        reference(type.name, args.first)
      else
        new_resource(type, args.first, args.last)
      end
    end
  end
end

.register_puppet_types_for_testingObject

Creates an instance method for every puppet type that either creates or references a resource



55
56
57
58
59
60
61
62
63
64
65
# File 'lib/shadow_puppet/test.rb', line 55

def self.register_puppet_types_for_testing
  Puppet::Type.loadall
  Puppet::Type.eachtype do |type|
    plural_type = type.name.to_s.downcase.pluralize
    #undefine the method rdoc placeholders
    undef_method(plural_type) rescue nil
    define_method(plural_type) do |*args|
      puppet_resources[type]
    end
  end
end

Instance Method Details

#configurationObject

Access to the configuration of the class of this instance.

class SampleManifest < ShadowPuppet::Manifest
configure(:name => 'test')
end

@manifest = SampleManifest.new
@manifest.configuration[:name] => "test"


148
149
150
# File 'lib/shadow_puppet/manifest.rb', line 148

def configuration
  self.class.configuration
end

#configure(hash) ⇒ Object Also known as: configuration=

Update the configuration of this manifest instance's class.

class SampleManifest < ShadowPuppet::Manifest
configure({})
end

@manifest = SampleManifest.new
@manifest.configure(:name => "test")
@manifest.configuration[:name] => "test"


181
182
183
# File 'lib/shadow_puppet/manifest.rb', line 181

def configure(hash)
  self.class.configure(hash)
end

#executable?Boolean

Returns true if this Manifest respond_to? all methods named by calls to recipe, and if this Manifest has not been executed before.

Returns:

  • (Boolean)


215
216
217
218
219
220
221
# File 'lib/shadow_puppet/manifest.rb', line 215

def executable?
  self.class.recipes.each do |meth,args|
    return false unless respond_to?(meth)
  end
  return false if executed?
  true
end

#execute(force = false) ⇒ Object

Execute this manifest, applying all resources defined. Execute returns true if successfull, and false if unsucessfull. By default, this will only execute a manifest that has not already been executed?. The force argument, if true, removes this check.



233
234
235
236
237
238
239
240
241
242
243
# File 'lib/shadow_puppet/manifest.rb', line 233

def execute(force=false)
  return false if executed? && !force
  evaluate_recipes
  apply
rescue Exception => e
  false
else
  true
ensure
  @executed = true
end

#execute!(force = false) ⇒ Object

Execute this manifest, applying all resources defined. Execute returns true if successfull, and raises an exception if not. By default, this will only execute a manifest that has not already been executed?. The force argument, if true, removes this check.



249
250
251
252
253
254
255
256
257
258
259
# File 'lib/shadow_puppet/manifest.rb', line 249

def execute!(force=false)
  return false if executed? && !force
  evaluate_recipes
  apply
rescue Exception => e
  raise e
else
  true
ensure
  @executed = true
end

#missing_recipesObject



223
224
225
226
227
# File 'lib/shadow_puppet/manifest.rb', line 223

def missing_recipes
  missing = self.class.recipes.each do |meth,args|
    !respond_to?(meth)
  end
end

#nameObject



191
192
193
# File 'lib/shadow_puppet/manifest.rb', line 191

def name
  @name ||= "#{self.class}##{self.object_id}"
end