On Fri, Jul 10, 2009 at 7:32 AM, Kurt Engle<kurt.en...@gmail.com> wrote:
> This is fantastic. I think something like this will be very useful in
> managing a large number of Macintosh clients. It is certainly the help and
> outcome that I was looking for when I started this thread. A big "Thank You"
> to Allan and everyone else that contributed.
>
> I took a little different but similar approach. I may adapt my approach to
> mimic Allan's as time permits. But... here is what I came up with.
>
> 1) A launchd job to run puppet every hour passing the $HOSTNAME as a
> certname arg.
> 2) If the machine is re-imaged at any time, a startup job is installed that
> uses ssh to contact the puppetmaster and delete the cert that corresponds to
> the machine's $HOSTNAME. Then the startup job deletes itself. So the job is
> only run once on a newly imaged machine.
>
> i) The machine's hostname is its serial number as determined by facter.

This is somewhat off-topic, but you shouldn't override $HOSTNAME on OS X.

You should instead set ComputerName/LocalHostName in SystemConfiguration, ie

scutil --set ComputerName foo
scutil --set LocalHostName foo
scutil --get ComputerName
scutil --get LocalHostName

etc.



>
> -kurt
>
> On Thu, Jul 9, 2009 at 6:12 PM, Allan Marcus <al...@lanl.gov> wrote:
>>
>> Putting it all together, here's what I have for cert management on Macs.
>>
>> 1) A launchd job to launch puppet every hour
>> 2) a script on the client to determine a unique attribute of the Mac
>> and use it for cert name
>> 3) a CGI on the server to clean a cert if the machine was re-imaged
>> 3a) note: alter /etc/sudoers on the server to allow the cgi to run
>> puppetca
>>
>> Testing is rather easy. Runt he puppetd.sh script on the client (as
>> root). Delete the /etc/puppet/ssl dir then run again. The system
>> should clean the cert on the server
>>
>>
>>
>> (1) This plist file should be in /Library/LaunchDaemons/
>> <?xml version="1.0" encoding="UTF-8"?>
>> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
>> "http://www.apple.com/DTDs/PropertyList-1.0.dtd
>> ">
>> <plist version="1.0">
>> <dict>
>>        <key>Label</key>
>>        <string>com.mycompany.puppetd</string>
>>        <key>ProgramArguments</key>
>>        <array>
>>                <string>/usr/bin/puppetd.sh</string>
>>        </array>
>>        <key>QueueDirectories</key>
>>        <array/>
>>        <key>StartInterval</key>
>>        <integer>3600</integer>
>>        <key>WatchPaths</key>
>>        <array/>
>> </dict>
>> </plist>
>>
>>
>> (2) /usr/bin/puppet.sh and chmod 700 and chown root:wheel
>> #!/bin/sh
>> # puppetd.sh script
>> # Script to run puppet and use the "correct" certname
>> # we need the certname to be unique, so hostname is not great
>>
>> # by Allan Marcus of LANL
>>
>> # Version History
>> # 2009-07-08: initial version
>>
>> # this script is run from a launchd job
>>
>> # this suffix is added to the value to make it look like a FQDN.
>> # This allows for auto sign to work on the server with a simply wildcard
>> SUFFIX=mycompany.com
>>
>> # this is the server to sent a puppetca clean to
>> SERVER=www.mycompany.com
>>
>>
>> # ---------------
>>
>> # see if the MAC_UID is in nvram already
>> MAC_UID=`nvram MAC_UID 2>/dev/null | awk '{print $2}'`
>> if [ -z "$MAC_UID" ]; then
>>        # flag that nothing is in nvram yet
>>        NVRAM="no"
>> fi
>>
>> # get the serial number for this Mac
>> if [ -z "$MAC_UID" ]; then
>>        MAC_UID=`facter | grep sp_serial_number | awk '{print $3}'`
>> fi
>>
>> # if the MAC_UID is still null
>> # get the primary MAC address
>> if [ -z "$MAC_UID" ]; then
>>        MAC_UID=`facter | grep 'macaddress =>' | awk '{print $3}'`
>> fi
>>
>> # if all the above fails, get the hostname
>> if [ -z "$MAC_UID" ]; then
>>        MAC_UID=`hostname`
>> fi
>>
>> # assuming we have something, write it to nvram
>> # getting it from nvram is much faster and is limited to this
>> # specific computer
>> if [ '$NVRAM' == 'no' ]; then
>>        # cert names must be lowercase
>>        MAC_UID=`echo $MAC_UID | tr "[:upper:]" "[:lower:]"`
>>        MAC_UID=${MAC_UID}.${SUFFIX}
>>        nvram MAC_UID=${MAC_UID}
>> fi
>>
>> RESULTS=`puppetd -o --no-daemonize -v --certname=$MAC_UID 2>&1`
>> RESULTS=`echo $RESULTS | grep 'Certificate request does not match
>> existing certificate'`
>>
>> if [ -z "$RESULTS" ]; then
>>        exit 0
>> else
>>         # curl call to a CGI to clean the cert
>>        curl "http://${SERVER}/cgi-bin/cleanCert.rb?certname=${MAC_UID}";
>> fi
>>
>> ### end puppetd.sh script ####
>>
>> (3) On the server in the CGI directory. On a Mac server you also need
>> to allow CGI's in server admin.
>> #!/usr/bin/ruby
>>
>> # clearCert.rb
>> # cgi to clean a cert
>>
>> class Puppetca
>>        # removes old certificate if it exists
>>        # parameter is the certname to use
>>        # need to allow the _www user to use sudo with the puppetca command
>>        # added using visudo
>>        # _www    ALL = NOPASSWD: /usr/bin/puppetca, !/usr/bin/puppetca --
>> clean --all
>>        def self.clean certname, addr
>>                command = "/usr/bin/sudo /usr/bin/puppetca --clean
>> #{certname}"
>>                # for some reason the "system" command causes Mac apache to
>> crash
>>                # when used here
>>                %x{#{command}}
>>                %x{"logger #{addr} cleaned #{certname}"}
>>                return true
>>        end
>> end
>>
>> =begin
>> CGI starts here
>> =end
>>
>> # get the value of the passed param in the URL Query_string
>> require 'cgi'
>> cgi=CGI.new
>> certname = cgi["certname"]
>>
>> # define the characters that are allow to avoid an injection attack
>> # 0-9, a-z, period, dash, and colon are allowed. All else is not
>> pattern = /[^a-z0-9.\-:]/
>> # determine if any other characters are in the certname
>> reject = (certname =~ pattern) ? 1 : 0
>>
>> if ((reject == 0) && Puppetca.clean(certname, ENV['REMOTE_ADDR']))
>>        cgi.out("status" => "OK", "connection" => "close") {"OK #{certname}
>> cleaned\n"}
>> else
>>        cgi.out("status" => "BAD_REQUEST", "connection" => "close") {"Not
>> Processed: #{certname}\n"}
>> end
>>
>>
>
>
> >
>



-- 
Nigel Kersten
nig...@google.com
System Administrator
Google, Inc.

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Puppet Users" group.
To post to this group, send email to puppet-users@googlegroups.com
To unsubscribe from this group, send email to 
puppet-users+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/puppet-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to