Henrik,
I really appreciate your patience here, but I feel like there is something
obvious that I am either not grasping or isn't spelled out in the
documentation.
Let's say I make a function called `lookup_file` which will do the
File.Read in whatever manner I need. I can call that from my manifests to
lookup the file, but how, then do I lookup the context from hiera? It's
the combination of these two things that seems abstract to me and is
preventing me from moving forward. I understand how to do both
individually, but I'm not sure how to retrieve the hiera context for the
path from within this "other" function....
I can see that any file_backend function I create chomps the key on the
first "." as we previously discussed, which means that I need to call a
function BEFORE that in order to call my file_backend from within my
file_lookup function, for instance.
How do I get the options and context to be used from the function my
manifest will be using? Let's assume in my manifest:
content => lookup_file('/tmp/somefile.txt')
does this work in my backend?
Puppet::Functions.create_function(:file_backend) do
dispatch :file_backend do
param 'String', :key
param 'Hash', :options
param 'Puppet::LookupContext', :context
end
def file_backend(key, options, context)
searchroot = options['path']
filename = "#{searchroot}/#{filename}"
# If file is found, return contents of file
# If file is not found, context.not_found()
end
def lookup_file(key)
options = :options
context = :context
file_backend(key, :options, :context)
end
end
I think that's the part I am struggling with... hiera knows about the
context and options, but my manifest knows (or should know) the proper key
to look up. How do I combine them so I retrieve the contents of the file?
On Sat, Sep 2, 2017 at 3:29 AM Henrik Lindberg <[email protected]>
wrote:
> On 01/09/17 01:32, John Baird wrote:
> > Henrik,
> >
> > I think the disconnect is coming from the fact that the documentation
> > only goes so far. In that, I mean, what should my lookup be from my
> > manifest?
> >
> > Should my manifest be:
> > $somefile = lookup('/etc/example.txt')
> > and then specify the file_backend in my hiera.yaml?
> >
> > Or should my manifest be:
> > $somefile = file_backend('/etc/example.txt')
> > and then specify the file_backed in my hiera.yaml?
> >
> > If I do the former, is specifying the ":key" just implied?
> > If I do the latter, I end up in a situation where the file_backend
> > function is looking for more arguments than just the simple filename.
> >
> > I feel like that's what's not really clear, since the YAML and JSON
> > backends simply append the key to the options path without ever
> > specifying the actual key existing in the backend. So it's a little
> > confusing how I should actually be interacting with the custom backend.
> >
>
> The big difference between the YAML and JSON backends is that they load
> files with keys in them. In your case the key is the "name" of the file!
>
> The JSON and YAML backends are of the data_hash kind. They are called
> once and must produce a hash of all the keys in the file pointed to by
> the path the backend is given. You do not want that since it would mean
> that you would have to slurp in all of the data files on the initial
> call. That could be a problem if you have lots of large files and they
> are not all needed for every compilation.
>
> Instead you need to deliver the value for a key per lookup of that key.
> The simple implementation takes the key appends it to the root path,
> reads that file and returns it as the value. If the file does not exist
> it should instead call $context.not_found().
>
> - henrik
>
>
> > On Monday, August 28, 2017 at 2:03:09 AM UTC-5, Henrik Lindberg wrote:
> >
> > On 28/08/17 00:45, John Baird wrote:
> > > The backend function receives a path in the options hash -
> > that path is
> > > guaranteed to exist - all non existing paths are simply
> > skipped by
> > > hiera
> > > (see the linked docs how it works). Thus, you do not need to
> > use any of
> > > the find file, etc. You can use relative paths in the
> > hiera.yaml config
> > > and hiera will figure it out (see the docs).
> > >
> > >
> > > Henrik,
> > >
> > > I believe I fully understand the context here, however, is the
> > "options"
> > > hash not fully referenced within the "hiera.yaml" ? Basically,
> > how do I
> > > access the lookup of the key itself from within a puppet manifest
> > as an
> > > appendage of the options['path']. I really believe that is the
> > piece I
> > > am just not able to connect. Can you help me understand how to
> > do this?
> > > Thanks!
> > >
> >
> > Not quite sure exactly where there is a piece of information
> > missing, so
> > pardon if I explain too much here.
> >
> > When hiera 5 processes a lookup it will visit each entry in the
> > hiera.yaml. Such an entry may use one out of several ways to specify
> a
> > set of file paths to check for existence (path, paths, glob). If the
> > path corresponds to something existing, a call is made to the
> function
> > associated with that entry. It receives an options hash where path is
> > set to the path that was found to be existing. This is repeated for
> all
> > the existing paths found in that entry.
> >
> > A user may have given additional options in the options hash.
> >
> > If the mode of the lookup is "priority" (first found) the search for
> a
> > value stops when a function produces a value for the key being
> searched
> > for. If the search is a kind of "merge" then the search continues
> until
> > all values for the key have been found.
> >
> > You can use the fact that the hiera framework performs the existence
> > check. If you do a glob to match all of the files your function will
> be
> > called with each - then simply check if the leaf file name matches
> the
> > key being looked up. Call "not_found" for all others, and read and
> > return the content for the one that matches.
> >
> > By doing that you get a small advantage in that you will not be
> > incurring checks for lots of file existence for all of the keys that
> > are
> > irrelevant and never will have a matching file.
> >
> > Does this help with what you were wondering about?
> > - henrik
> >
> > --
> >
> > Visit my Blog "Puppet on the Edge"
> > http://puppet-on-the-edge.blogspot.se/
> > <http://puppet-on-the-edge.blogspot.se/>
> >
> > --
> > You received this message because you are subscribed to the Google
> > Groups "Puppet Users" group.
> > To unsubscribe from this group and stop receiving emails from it, send
> > an email to [email protected]
> > <mailto:[email protected]>.
> > To view this discussion on the web visit
> >
> https://groups.google.com/d/msgid/puppet-users/9f084cd5-73b7-4b17-9c81-8a386af77dc4%40googlegroups.com
> > <
> https://groups.google.com/d/msgid/puppet-users/9f084cd5-73b7-4b17-9c81-8a386af77dc4%40googlegroups.com?utm_medium=email&utm_source=footer
> >.
> > For more options, visit https://groups.google.com/d/optout.
>
>
> --
>
> Visit my Blog "Puppet on the Edge"
> http://puppet-on-the-edge.blogspot.se/
>
> --
> You received this message because you are subscribed to a topic in the
> Google Groups "Puppet Users" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/puppet-users/TNDd6f8K6H8/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/puppet-users/oodq2v%241su%241%40blaine.gmane.org
> .
> For more options, visit https://groups.google.com/d/optout.
>
--
You received this message because you are subscribed to the Google Groups
"Puppet Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/puppet-users/CACSjNA4Uk7hHP5zbODY4YT9BTboEVuu5WqKSJeAR83sO7ScD6A%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.