From 9a4fef865f90bdb59dd3aca831cd16d92e5e573d Mon Sep 17 00:00:00 2001 From: Dan Bode Date: Thu, 24 Feb 2011 20:38:33 -0600 Subject: [PATCH] first commit of create_resources module. it was called accepts. I added the ability to specify classes or definitions. --- README | 29 +++++++++++++++++ .../parser/functions/create_resources.rb | 32 +++++++++++++++++++ manifests/init.pp | 7 ++++ manifests/user.pp | 7 ++++ tests/users.pp | 32 +++++++++++++++++++ 5 files changed, 107 insertions(+) create mode 100644 README create mode 100644 lib/puppet/parser/functions/create_resources.rb create mode 100644 manifests/init.pp create mode 100644 manifests/user.pp create mode 100644 tests/users.pp diff --git a/README b/README new file mode 100644 index 0000000..b2d62b0 --- /dev/null +++ b/README @@ -0,0 +1,29 @@ +- License - GPL2 +- Copyright - Puppetlabs 2011 + +This module contains a custom function for puppet that can be used to dynamically add resources to the catalog. + +I wrote this to use with an external node classifier that consumes YAML. + +The yaml specifies classes and passes hashes to those classes as parameters + +classes: + webserver::instances: + instances: + instance1: + foo: bar + instance2: + foo: blah + +Then puppet code can consume the hash parameters and convert then into resources + +class webserver::instances ( + $instances = {} +) { + create_resources('webserver::instance', $instances) +} + +Now I can dynamically determine how webserver instances are deployed to nodes +by updating the YAML files. + + diff --git a/lib/puppet/parser/functions/create_resources.rb b/lib/puppet/parser/functions/create_resources.rb new file mode 100644 index 0000000..64356b5 --- /dev/null +++ b/lib/puppet/parser/functions/create_resources.rb @@ -0,0 +1,32 @@ +Puppet::Parser::Functions::newfunction(:create_resources, :doc => ' +Converts a hash into resources and adds them to the catalog. +Takes two parameters: + create_resource($type, $resources) + Creates resources of type $type from the $resources hash. Assumes that + hash is in the following form: + {title=>{attr=>value}} +') do |args| + raise ArgumentError, 'requires resource type and param hash' if args.size < 2 + args[1].each do |title, params| + # TODO - add argument to specify constraints on parameters + raise ArgumentError, 'params should not contain title' if(params['title']) + if type = Puppet::Type.type(args[0].to_sym) + resource = type.hash2resource(params.merge(:title => title)) + catalog.add_resource(resource) + elsif args[0].downcase == 'class'# || args[0].downcase == 'node' + klass = find_hostclass(title) + klass.ensure_in_catalog(self, params) + compiler.catalog.add_class([title]) + else + # TODO - use ensure_in_catalog when it supports definitions + # we assume that if nothing else mathces is must be a defined resource type + resource = find_definition(args[0]) + p_resource = Puppet::Parser::Resource.new(args[0], title, :scope => self, :source => resource) + params.merge(:name => title).each do |k,v| + p_resource.set_parameter(k,v) + end + resource.instantiate_resource(self, p_resource) + compiler.add_resource(self, p_resource) + end + end +end diff --git a/manifests/init.pp b/manifests/init.pp new file mode 100644 index 0000000..21b7e47 --- /dev/null +++ b/manifests/init.pp @@ -0,0 +1,7 @@ +class create_resources( + $ensure, + $user_name=$name +){ + user{$name: ensure => $ensure} + notify{$user_name:} +} diff --git a/manifests/user.pp b/manifests/user.pp new file mode 100644 index 0000000..a0c0421 --- /dev/null +++ b/manifests/user.pp @@ -0,0 +1,7 @@ +define create_resources::user( + $ensure, + $user_name=$operatingsystem +){ + user{$name: ensure => $ensure} + notify{$user_name:} +} diff --git a/tests/users.pp b/tests/users.pp new file mode 100644 index 0000000..451309a --- /dev/null +++ b/tests/users.pp @@ -0,0 +1,32 @@ +$users3 = { + 'dannyboy454' => { + 'user_name'=>'dlfjdslkf', + 'ensure'=>present, + 'require' => 'User[foobar]', + 'before' => 'User[sally-mae]' + }, + 'bobby-joe' => {'ensure'=>present} +} +create_resources('create_resources::user', $users3) + +# TODO - types are not applied in main stage +$users = { + 'sally-mae' => + {'ensure' => 'present', + 'require' => 'User[bobby-joe]' + } +} +create_resources('user', $users) + +user { 'foobar': + ensure => present, + require => User['bobby-joe'] +} + +$classes = { + 'create_resources' => { + 'ensure' => 'present' + } +} + +create_resources('class', $classes)