Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

I am creating a user as follow

user { $username:
    comment => "$name",
    shell   => "$shell",
    managehome => false,
    password  => "$password",
    groups => $groups
}

Now as u can see I am doing a managehome is false Now later down the lane I need to push a file to the user’s home directory.

$key = "${homedir}/${name}/file"

    file { $key:
    ensure => present,
    owner  => $username,
    group  => $username,
    mode   => 600,
    content => "$keyvalue",
    subscribe => User[$username],
}

How can I get the user’s home directory for this?

share|improve this question

2 Answers 2

up vote 9 down vote accepted

Hm, i think there you'll need a facter modul to do that and a little hacky manifest file...

facter module: This will register facter variables for all users. like "home_root" or "home_apache".

require 'etc'

Etc.passwd { |user|

   Facter.add("home_#{user.name}") do
      setcode do
         user.dir
      end
   end

}

and then you can use them inside your manifest file like this:

$username = "root"
$home = "home_$username"
$home_path = inline_template("<%= scope.lookupvar('::$home') %>")

file { "$home_path/test.txt":
   content => "huhu",
}

Perhaps there is a better way, but i'm afraid not.

share|improve this answer
    
Can you give me some guidance on where to put this manifests? I have my basic class in init.pp and where do I go from there? –  Quintin Par Aug 24 '12 at 13:59
1  
@QuintinPar i've just started to upload some puppet examples or best practices to github. you'll find this example (facter class) here: github.com/drandor/puppet-examples/tree/master/modules/user you need to have pluginsync activated on your master and your agent. the second code can be used anywhere in your *.pp files. The puppet configuration and node manifests (with stages) can be found here: github.com/drandor/puppet-config –  jfried Aug 24 '12 at 23:22
1  
If the user does not yet exist on the machine (new user is added), home_user fact is not available. Creating new users might need two Puppet runs. On the first run, $home_path is empty, and this might lead to unwanted results. –  Mikko Oct 10 '12 at 9:27

I tried to find a solution for the exactly same problem, and it turned out it's best to take a slightly different approach.

Define home directory explicitly, for example:

user { $username:
    comment    => "comment",
    home       => "/home/${username}",
    managehome => false,
    # ...
}

When managehome is false, the home directory is not even created. So you have to specifically define it. It's often best to make a custom definition for the whole user:

define custom_user($username, $password) {
    user { $username:
        home     => "/home/${username}",
        password => $password,
        # etc.
    }
    file { "/home/${username}":
        ensure  => directory,
        owner   => $username,
        require => User[$username],
        # etc.
    }
}

You can add more parameters, for example $keyvalue, and create a keyfile if that parameter is given.

You can also define a global variable $home = "/home" (OS specific, if needed) and get home dir with "${home}/${username}".

Edit: Using hash to define user-specific home directories

More recent Puppet versions (>= 2.6) support hashes. It would be possible to define a hash containing username => /path/to/home mappings for each user:

$home = {
    normal_user => '/home/normal_user',
    backup      => '/var/backup',
    mysql       => '/var/lib/mysql'
}

For any username, it is then easy to get home directory with $home['username'].

Home directory hash with fallback

Most of the time, it would be best to have a "fallback default" if user does not exist in the hash. In theory this is possible, although syntax becomes a little cryptic and bloated:

$home = { ... }
$default_home = '/home'

user {$username:
    home => has_key($home, $username) ? {
                true => $home[$username], 
                false => "${default_home}/${username}" 
            }
    # ...
}
share|improve this answer
2  
This does ont work when /home is not the default. say /var/lib/psql –  Quintin Par Aug 26 '12 at 5:00
    
@Barry: Did you read the rest of the answer, "user-specific home directories"? (The answer was edited after the comment by Quintin Par) –  Mikko Oct 10 '12 at 9:19
    
@Mikko Yeap, and I tried to upvote the correct (accepted) answer. It was locked. –  Barry Oct 14 '12 at 0:23

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.