Thanks Jeff,
I copy-pasted the code and it just worked. Here is my function:
require 'uri'
module Puppet::Parser::Functions
newfunction(:loadyaml, :doc => <<-'ENDHEREDOC') do |args|
Load a YAML file containing a hash, set the hash values.
Support puppet urls
For example:
loadyaml('/etc/puppet/data/myhash.yaml')
loadyaml('puppet:///modules/name/myhash.yaml')
ENDHEREDOC
unless args.length == 1
raise Puppet::ParseError, ("loadyaml(): wrong number of
arguments (#{args.length}; must be 1)")
end
params = nil
path = args[0]
unless Puppet::Util.absolute_path?(path)
uri = URI.parse(URI.escape(path))
raise Puppet::ParseError, ("Cannot use relative URLs
'#{path}'") unless uri.absolute?
raise Puppet::ParseError, ("Cannot use opaque URLs
'#{path}'") unless uri.hierarchical?
raise Puppet::ParseError, ("Cannot use URLs of type
'#{uri.scheme}' as source for fileserving") unless
%w{puppet}.include?(uri.scheme)
Puppet.info "loading parameters from #{path}"
content = Puppet::FileServing::Content.indirection.find(path)
params = YAML.load(content.content)
else
params = YAML.load_file(path)
end
params.each do |param, value|
setvar(param, value)
end
end
end
2012/11/14 Jeff McCune <[email protected]>:
> On Tue, Nov 13, 2012 at 5:25 AM, woosley. xu. <[email protected]> wrote:
>> I am thinking about loading some paramters from a external file for my
>> souces. Eg,
>>
>> class test {
>>
>> ## set parameters.
>> load_from_yaml("puppet:///modules/test/config.yaml")
>> }
>
> Ah, cool idea. I think this would be a really valuable function to
> include in the stdlib [1] module.
>
> While it's very difficult to get the filesystem path, it seems like
> you really only need the contents of the file. If you have a
> puppet:// URI, you can speak to the Puppet fileserve using the REST
> API to get the file contents. This would avoid the need to read the
> file from disk yourself and it will work well even in multiple-master
> deployment scenarios since you're speaking to the API rather than to
> the underlying filesystem.
>
> The static compiler does just this. It reads the contents of the file
> using the FileServer API in the store_content method:
> https://github.com/puppetlabs/puppet/blob/master/lib/puppet/indirector/catalog/static_compiler.rb#L160-161
>
> You might be able to do something similar in your parser function.
> Given a URI, pass the string form to
> Puppet::FileServing::Content.indirection.find and you should get back
> a Ruby instance that models the file metadata and contains the
> content.
>
> Hope this helps,
> -Jeff
>
> [1] https://forge.puppetlabs.com/puppetlabs/stdlib
>
> --
> You received this message because you are subscribed to the Google Groups
> "Puppet Users" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/puppet-users?hl=en.
>
--
woosley.xu. http://twitter.com/redicaps
--
You received this message because you are subscribed to the Google Groups
"Puppet Users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/puppet-users?hl=en.