The problem was that the yaml indirector used different settings
depending on the run_mode.
lib/puppet/indirector/yaml.rb:44
# Return the path to a given node's file.
def path(name,ext='.yaml')
base = Puppet.run_mode.master? ? Puppet[:yamldir] : Puppet[:clientyamldir]
File.join(base, self.class.indirection_name.to_s, name.to_s + ext)
end
This means in my script I can just set the clientyamldir to be the
yamldir and it works. This appears to be the only place in the code
that either of these settings are used.
I propose that instead of checking the run_mode in the indirector, we
combine these settings into one setting and have the location be
dependent on run_mode in defaults.rb. I can't think of any reason why
this wouldn't work and be less confusing. Anyone else?
On Tue, Sep 14, 2010 at 3:54 PM, Matt Robinson <[email protected]> wrote:
> I was indeed the run_mode. Thanks for the tip.
>
> When run_mode is the default of user
>
> irb(main):001:0> require 'puppet'
> => true
> irb(main):005:0> Puppet[:run_mode]
> => "user"
> irb(main):003:0> Puppet::Node::Facts.terminus_class = :yaml
> => :yaml
> irb(main):004:0>
> Puppet::Node.find('ubuntu1004desktop.localdomain').parameters["operatingsystem"]
> => nil
>
> However if run_mode is master (I changed to code to get this result)
> it gets the right facts (the ones from the yamldir)
>
> irb(main):001:0> require 'puppet'
> => true
> irb(main):005:0> Puppet[:run_mode]
> => "master"
> irb(main):003:0> Puppet::Node::Facts.terminus_class = :yaml
> => :yaml
> irb(main):004:0>
> Puppet::Node.find('ubuntu1004desktop.localdomain').parameters["operatingsystem"]
> => "Ubuntu"
>
> Unfortunately there isn't a great, non-hacky way to change the
> run_mode in a script that I see. I'll see if I can find the place in
> the code where finding the node's facts depends on run_mode and get
> rid of that.
>
> On Mon, Sep 13, 2010 at 9:36 PM, Luke Kanies <[email protected]> wrote:
>> On Sep 13, 2010, at 8:56 PM, Matt Robinson wrote:
>>
>>> On puppet 2.6 I'm trying to get the compiled catalog for a node in a
>>> script, but I'm having trouble figuring out how to do this with puppet
>>> code and still take the facts into account (the facts live in the
>>> --yamldir by default at /var/lib/puppet/yaml/facts). I'm hoping
>>> someone knows how to do this without having to do a lot of digging,
>>> since if that's what it takes I'll keep digging.
>>>
>>> I can find the catalog like so
>>>
>>> require 'puppet'
>>> Puppet::Resource::Catalog.find('ubuntu1004desktop.localdomain')
>>>
>>> But the catalog this finds doesn't use fact information. I can tell
>>> because if I have a site.pp like this:
>>>
>>> node default {
>>> $mynotice = $operatingsystem ? {
>>> Ubuntu => 'ubuntu',
>>> default => 'blah',
>>> }
>>> notify { $mynotice : }
>>>
>>> and in irb run
>>>
>>>
>>> Puppet::Resource::Catalog.find('ubuntu1004desktop.localdomain').vertices.select
>>> {|vertex| vertex.type == "Notify"}.map {|v| v.title}
>>> => ["blah"]
>>>
>>> I know the facts can be accessed by puppet code since I can get the
>>> catalog to compile to pson and use the facts in the yamldir (looks
>>> like yamldir isn't the best name for that option or directory) using
>>> the --compile option:
>>>
>>> puppet master --compile ubuntu1004desktop.localdomain
>>> =>
>>> {
>>> "exported": false,
>>> "line": 6,
>>> "title": "ubuntu",
>>> "tags": [
>>> "notify",
>>> "ubuntu",
>>> "node",
>>> "default",
>>> "class"
>>> ],
>>> "type": "Notify",
>>> "file": "/etc/puppet/manifests/site.pp"
>>> },
>>>
>>> So I thought I traced the code path to see where the facts were
>>> getting loaded and found a couple things that I thought might get the
>>> facts to load properly, but they didn't. Here's a few of the things
>>> I've tried to get the facts loaded.
>>>
>>> Puppet::Node.cache_class = :yaml
>>> Puppet::Node::Facts.terminus_class = :facter
>>> Puppet::Node::Facts.cache_class = :yaml
>>> Puppet.parse_config
>>>
>>> Probably way more info than anyone needed and thanks in advance if
>>> anyone knows where to look.
>>
>> I think you're essentially there - I think if you just set the
>> Facts.terminus_class = :yaml, it should work. I think you're looking at the
>> terminus settings for puppet but you want puppetmaster behavior.
>>
>> You can introspect this pretty easily with irb:
>>
>> l...@localhost $ irb
>> irb(main):001:0> require 'puppet'
>> => true
>> irb(main):002:0> Puppet[:confdir] = "/tmp/foo"
>> => "/tmp/foo"
>> irb(main):003:0> Puppet[:vardir] = "/tmp/foo"
>> => "/tmp/foo"
>> irb(main):004:0> Puppet::Node::Facts.terminus_class = :yaml
>> => :yaml
>> irb(main):005:0> Puppet::Node.terminus_class = :plain
>> => :plain
>> irb(main):006:0> Puppet::Node.find "localhost"
>> => #<Puppet::Node:0x1024cb500 @name="localhost", @classes=[],
>> @expiration=Mon Sep 13 21:51:51 -0700 2010, @time=Mon Sep 13 21:21:51 -0700
>> 2010, @parameters={}>
>> irb(main):014:0> Puppet::Node::Facts.indirection.terminus.base
>> => "/tmp/foo/client_yaml"
>>
>> So basically, you can see that the params aren't including the facts, and
>> this is a problem with the run_mode, which I don't quite understand. Jesse
>> Wolfe should be able to help with that, I think, and once you've got that
>> sorted you should be all set.
>>
>> Make sense?
>>
>> --
>> We all have strength enough to endure the misfortunes of others.
>> -- Francois de La Rochefoucauld
>> ---------------------------------------------------------------------
>> Luke Kanies -|- http://puppetlabs.com -|- +1(615)594-8199
>>
>>
>>
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Puppet Developers" 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-dev?hl=en.
>>
>>
>
--
You received this message because you are subscribed to the Google Groups
"Puppet Developers" 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-dev?hl=en.