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.

Reply via email to