I'm trying to approach ssh authorized_keys distribution from another  
angle. It seems like the standard method is to either put the ssh  
public key into a variable in a puppet manifest or to place the file  
within the puppet file hierarchy. I'm not happy with either of these  
options, because I would like to create a user from start to finish as  
hands-off as possible (including ssh key generation and propagation).

So I want the following to happen:

- Define a user in a puppet class
- Have puppet create that user's home directory and ssh public/private  
keys on the main server
- Export public keys into that user's authorized_keys file on every  
server

I have a method that does this (or so it seems), but the main problem  
is that without some tomfoolery I can't figure out how to read a  
file's contents into a variable only AFTER that file is created by an  
exec command.

I have the following (after 'user' has been called):

        if $hostname == puppet {
                 exec { "create-ssh-key-$n...@$domain":
                         command => "ssh-keygen -t rsa -C '$name@ 
$domain' -N '' -q -f /home/$name/.ssh/id_rsa",
                         path => "/usr/bin:/bin",
                         creates => ["/home/$name/.ssh/id_rsa","/home/ 
$name/.ssh/id_rsa.pub"],
                         require => [ User["$name"], File["/home/ 
$name/.ssh/"] ],
                         before => Ssh_authorized_key["$n...@$domain"],
                         user => $name,
                 }

                 @@ssh_authorized_key { "$n...@$domain":
                         ensure => present,
                         key => generate("/usr/bin/cut","-f2","-d ","/ 
home/$name/.ssh/id_rsa.pub"),
                         target => "/home/$name/.ssh/authorized_keys",
                         type => ssh-rsa,
                         user => $name,
                         name => "$n...@$domain",
                         require => User["$name"],
                 }
        }

        Ssh_authorized_key <<| name == "$n...@$domain" |>>

However, unless I completely remove the ssh_authorized_key call until  
the user exists, I wind up with this error:

May 16 00:44:12 puppet puppetmasterd[22843]: Failed to execute  
generator /usr/bin/cut: Execution of '/usr/bin/cut -f2 -d  /home/ 
user/.ssh/id_rsa.pub' returned 1: /usr/bin/cut: /home/user/.ssh/ 
id_rsa.pub: No such file or directory  at /etc/puppet/modules/users/ 
manifests/init.pp:34 on node puppetmaster

I've tried a number of different requires, befores, and splitting  
things into multiple files/classes/defines to try to force the  
execution order that I want but to no avail. It seems like 'generate'  
is always run early, and so the user and id_rsa.pub file haven't been  
made yet.

I finally used the following tactic:

key => file("/home/$name/.ssh/id_rsa.pub","/etc/ssh/ssh_host_key.pub")

so that the first execution puts the host's public key into  
authorized_keys (which serves no purpose, but it's the same format and  
that file will always exist) and the second execution does the right  
thing. But it's pretty gross, and it means users will take a longer  
time than necessary to fully propagate.

Is there some method that I'm overlooking to force puppet to schedule  
'ssh_authorized_key' after 'exec' in this case?

--
Simon Kuhn

--~--~---------~--~----~------------~-------~--~----~
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