Add ensure_resources() function
New function "ensure_resources()" to support passing hash as parameter OR from hiera backend This new function is extension of ensure_resource() which will now support to pass multiple values as hash/array OR from hiera backend variables in title argument with additional parameters needed. It will process multiple values for a resource type from the passed argument & pass each entry (type, title, params) to ensure_resource() in required format for further processing. Now user can have duplicate resource check functionality extended to multiple entries with this new function. Use: For multiple resources using hash: ensure_resources('user', {'dan' => { gid => 'mygroup', uid =>'600' } , 'alex' => { gid => 'mygroup' }}, {'ensure' =>'present'}) From Hiera Backend: userlist: dan: gid: 'mygroup' uid: '600' alex: gid: 'mygroup' Call: ensure_resources('user',hiera_hash('userlist'), {'ensure' => 'present'}) ensure_packages() Modified to also support Hash type argument for packages This modification will call newly added ensure_resources() for processing Hash as second argument. The original functionality remains same for Array type arguments. Use: hiera: packagelist: ksh: ensure: latest mlocate: {} myrpm: provider: rpm source: "/tmp/myrpm-1.0.0.x86_64.rpm" install_options: --prefix: /users/home openssl: provider: rpm source: "/tmp/openssl-1.0.1e-42.el7.x86_64.rpm" Call: ensure_packages($packagelist)
This commit is contained in:
parent
69ca8d09c6
commit
0da9ca7e4a
3 changed files with 113 additions and 10 deletions
|
@ -346,7 +346,15 @@ Returns true if the argument is an array or hash that contains no elements, or a
|
||||||
|
|
||||||
#### `ensure_packages`
|
#### `ensure_packages`
|
||||||
|
|
||||||
Takes a list of packages and only installs them if they don't already exist. It optionally takes a hash as a second parameter to be passed as the third argument to the `ensure_resource()` function. *Type*: statement.
|
Takes a list of packages array/hash and only installs them if they don't already exist. It optionally takes a hash as a second parameter to be passed as the third argument to the `ensure_resource()` or `ensure_resources()` function. *Type*: statement.
|
||||||
|
|
||||||
|
For Array:
|
||||||
|
|
||||||
|
ensure_packages(['ksh','openssl'], {'ensure' => 'present'})
|
||||||
|
|
||||||
|
For Hash:
|
||||||
|
|
||||||
|
ensure_packages({'ksh' => { enure => '20120801-1' } , 'mypackage' => { source => '/tmp/myrpm-1.0.0.x86_64.rpm', provider => "rpm" }}, {'ensure' => 'present'})
|
||||||
|
|
||||||
#### `ensure_resource`
|
#### `ensure_resource`
|
||||||
|
|
||||||
|
@ -370,7 +378,37 @@ An array of resources can also be passed in, and each will be created with the t
|
||||||
|
|
||||||
*Type*: statement.
|
*Type*: statement.
|
||||||
|
|
||||||
#### `flatten`
|
#### `ensure_resources`
|
||||||
|
|
||||||
|
Takes a resource type, title (only hash), and a hash of attributes that describe the resource(s).
|
||||||
|
|
||||||
|
~~~
|
||||||
|
user { 'dan':
|
||||||
|
gid => 'mygroup',
|
||||||
|
ensure => present,
|
||||||
|
}
|
||||||
|
|
||||||
|
ensure_resources($user)
|
||||||
|
~~~
|
||||||
|
|
||||||
|
An hash of resources should be passed in and each will be created with the type and parameters specified if it doesn't already exist:
|
||||||
|
|
||||||
|
ensure_resources('user', {'dan' => { gid => 'mygroup', uid => '600' } , 'alex' => { gid => 'mygroup' }}, {'ensure' => 'present'})
|
||||||
|
|
||||||
|
From Hiera Backend:
|
||||||
|
|
||||||
|
~~~
|
||||||
|
userlist:
|
||||||
|
dan:
|
||||||
|
gid: 'mygroup'
|
||||||
|
uid: '600'
|
||||||
|
alex:
|
||||||
|
gid: 'mygroup'
|
||||||
|
|
||||||
|
ensure_resources('user', hiera_hash('userlist'), {'ensure' => 'present'})
|
||||||
|
~~~
|
||||||
|
|
||||||
|
### `flatten`
|
||||||
|
|
||||||
Flattens deeply nested arrays and returns a single flat array as a result. For example, `flatten(['a', ['b', ['c']]])` returns ['a','b','c']. *Type*: rvalue.
|
Flattens deeply nested arrays and returns a single flat array as a result. For example, `flatten(['a', ['b', ['c']]])` returns ['a','b','c']. *Type*: rvalue.
|
||||||
|
|
||||||
|
|
|
@ -17,18 +17,29 @@ third argument to the ensure_resource() function.
|
||||||
raise(Puppet::ParseError, 'ensure_packages(): Requires second argument to be a Hash')
|
raise(Puppet::ParseError, 'ensure_packages(): Requires second argument to be a Hash')
|
||||||
end
|
end
|
||||||
|
|
||||||
packages = Array(arguments[0])
|
if arguments[0].is_a?(Hash)
|
||||||
|
if arguments[1]
|
||||||
|
defaults = { 'ensure' => 'present' }.merge(arguments[1])
|
||||||
|
else
|
||||||
|
defaults = { 'ensure' => 'present' }
|
||||||
|
end
|
||||||
|
|
||||||
if arguments[1]
|
Puppet::Parser::Functions.function(:ensure_resources)
|
||||||
defaults = { 'ensure' => 'present' }.merge(arguments[1])
|
function_ensure_resources(['package', Hash(arguments[0]), defaults ])
|
||||||
else
|
else
|
||||||
defaults = { 'ensure' => 'present' }
|
packages = Array(arguments[0])
|
||||||
end
|
|
||||||
|
|
||||||
Puppet::Parser::Functions.function(:ensure_resource)
|
if arguments[1]
|
||||||
packages.each { |package_name|
|
defaults = { 'ensure' => 'present' }.merge(arguments[1])
|
||||||
function_ensure_resource(['package', package_name, defaults ])
|
else
|
||||||
|
defaults = { 'ensure' => 'present' }
|
||||||
|
end
|
||||||
|
|
||||||
|
Puppet::Parser::Functions.function(:ensure_resource)
|
||||||
|
packages.each { |package_name|
|
||||||
|
function_ensure_resource(['package', package_name, defaults ])
|
||||||
}
|
}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
54
lib/puppet/parser/functions/ensure_resources.rb
Normal file
54
lib/puppet/parser/functions/ensure_resources.rb
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
require 'puppet/parser/functions'
|
||||||
|
|
||||||
|
Puppet::Parser::Functions.newfunction(:ensure_resources,
|
||||||
|
:type => :statement,
|
||||||
|
:doc => <<-'ENDOFDOC'
|
||||||
|
Takes a resource type, title (only hash), and a list of attributes that describe a
|
||||||
|
resource.
|
||||||
|
|
||||||
|
user { 'dan':
|
||||||
|
gid => 'mygroup',
|
||||||
|
ensure => present,
|
||||||
|
}
|
||||||
|
|
||||||
|
An hash of resources should be passed in and each will be created with
|
||||||
|
the type and parameters specified if it doesn't already exist.
|
||||||
|
|
||||||
|
ensure_resources('user', {'dan' => { gid => 'mygroup', uid => '600' } , 'alex' => { gid => 'mygroup' }}, {'ensure' => 'present'})
|
||||||
|
|
||||||
|
From Hiera Backend:
|
||||||
|
|
||||||
|
userlist:
|
||||||
|
dan:
|
||||||
|
gid: 'mygroup'
|
||||||
|
uid: '600'
|
||||||
|
alex:
|
||||||
|
gid: 'mygroup'
|
||||||
|
|
||||||
|
Call:
|
||||||
|
ensure_resources('user', hiera_hash('userlist'), {'ensure' => 'present'})
|
||||||
|
|
||||||
|
ENDOFDOC
|
||||||
|
) do |vals|
|
||||||
|
type, title, params = vals
|
||||||
|
raise(ArgumentError, 'Must specify a type') unless type
|
||||||
|
raise(ArgumentError, 'Must specify a title') unless title
|
||||||
|
params ||= {}
|
||||||
|
|
||||||
|
if title.is_a?(Hash)
|
||||||
|
resource_hash = Hash(title)
|
||||||
|
resources = resource_hash.keys
|
||||||
|
|
||||||
|
Puppet::Parser::Functions.function(:ensure_resource)
|
||||||
|
resources.each { |resource_name|
|
||||||
|
if resource_hash[resource_name]
|
||||||
|
params_merged = params.merge(resource_hash[resource_name])
|
||||||
|
else
|
||||||
|
params_merged = params
|
||||||
|
end
|
||||||
|
function_ensure_resource([ type, resource_name, params_merged ])
|
||||||
|
}
|
||||||
|
else
|
||||||
|
raise(Puppet::ParseError, 'ensure_resources(): Requires second argument to be a Hash')
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue