Re: [Puppet Users] Re: using return value of a shell command as a puppet conditional

Ashley Gould
Tue, 01 Feb 2011 02:14:51 -0000

> > thank you both. my current task will use a file action. I''m
trying
> > to make puppet chose between alturnative versions of a file based on
> > the result of a binary.
> >
> > I will work on the custom fact idea.  if such an issue is coming at
> > me so early in the game, then I may as well get started learning
> > how to build facts.
>
> For what it is worth, I would say that the reason you are running into
> this so early in the process is that you are not yet using puppet the
> way it expects to be used – and, so, you run into these complications.
>
> In the puppet model you would not ask the system about that binary,
> then do something: you would say "machine A should have the binary,
> and the something, while machine B should not have either".
>
> The idea is that you declare, as far as possible, the state your
> system should be – not what calculations you make to get from the
> current to the desired state.  Fact should, ideally, be things about
> the system that don''t vary (memory size, disk space) with state
> changes, not questions about the current state.
>
> So, I would strongly encourage you to "answer" the question about
that
> binary by deciding if the machine should have it installed, and if it
> should work, and then implementing *that* in puppet.  The file install
> bit should just fall into line after that.
>


You caught me.  I''m a recoveing cfengine junky.  It will take a while
to stop thinking in terms of making actions dependent on client''s
membership in a (cf) class.

So here are the specifics of what I''m trying to do in this particular
task.  I welcome any ideas on following the puppet way:

We run a 3rd party tool called centrifyDC to integrate our linux
servers with AD.  a client can either be "joined" to a centrify (AD)
zone or not.  I''m writing a puppet module to manage site
customizations to various files in /etc/pam.d.  Trouble is centrify,
when joining to AD, will prepend it''s own pam configs to my existing
pam files.  so before I can push my custom pam configs, I need to
know if the client is joined to AD or not.  the command to check the
centify status is /usr/bin/adinfo.  it is installed on all nodes via
puppet.


My first fact (I am so proud):

# adinfo.rb
# Mon Jan 31 15:54:02 PST 2011
# agould@ucop.edu
#
# a custom fact returning the centrify zone

if FileTest.exists?("/usr/bin/adinfo")
        Facter.add(:adinfo) do
                setcode do
                        %x{/usr/bin/adinfo --zone}.chomp
                end
        end
end


modules/pam/manifests/init.pp:
# module pam
# pmlab01-vhost.ucop.edu
# Fri Jan 28 17:34:53 PST 2011
# agould@ucop.edu

# Pam configs
class pam {
        file { "/etc/pam.d":
                owner   => root, group   => root, mode    => 644,
                if $adinfo {
                        source  => "puppet:///pam/centrify",
                } else {
                        source  => "puppet:///pam/no_centrify",
                }
                recurse => true,
        }
}







On Mon, Jan 31, 2011 at 03:46:32PM -0800, Daniel Pittman
wrote:
> On Mon, Jan 31, 2011 at 15:31, Ashley Gould <agould@ucop.edu> wrote:
> > On Mon, Jan 31, 2011 at 02:14:29PM -0800, jcbollinger wrote:
> >> On Jan 31, 3:12 pm, Ashley Gould <ago...@ucop.edu> wrote:
> >>
> >> > if [ "/usr/bin/my_harmless_binary 2>&1
>/dev/null" ]; then
> >> >   echo "my_harmless_binary succeeded"
> >> >   cp /tmp/file1 /data/
> >> > else
> >> >   echo "my_harmless_binary FAILED"
> >> > fi
>
> [...]
> Regards,
>     Daniel
> --
> ⎋ Puppet Labs Developer – http://puppetlabs.com
> ✉ Daniel Pittman <daniel@puppetlabs.com>
> ✆ Contact me via gtalk, email, or phone: +1 (877) 575-9775
> ♲ Made with 100 percent post-consumer electrons

--

-ashley

Did you try poking at it with a stick?