Eu tentei encontrar uma solução para exatamente o mesmo problema, e descobri que é melhor ter uma abordagem um pouco diferente.
Defina o diretório inicial explicitamente, por exemplo:
user { $username:
comment => "comment",
home => "/home/${username}",
managehome => false,
# ...
}
Quando managehome
é falso, o diretório inicial nem sequer é criado. Então você tem que defini-lo especificamente. Geralmente, é melhor criar uma definição personalizada para todo o usuário:
define custom_user($username, $password) {
user { $username:
home => "/home/${username}",
password => $password,
# etc.
}
file { "/home/${username}":
ensure => directory,
owner => $username,
require => User[$username],
# etc.
}
}
Você pode adicionar mais parâmetros, por exemplo $keyvalue
, e criar um arquivo-chave se esse parâmetro for fornecido.
Você também pode definir uma variável global $home = "/home"
(específica do SO, se necessário) e acessar o diretório home com "${home}/${username}"
.
Editar: usando o hash para definir diretórios iniciais específicos do usuário
Versões mais recentes do Puppet (> = 2.6) suportam hashes. Seria possível definir um hash contendo username => /path/to/home
mappings para cada usuário:
$home = {
normal_user => '/home/normal_user',
backup => '/var/backup',
mysql => '/var/lib/mysql'
}
Para qualquer nome de usuário, é fácil acessar o diretório home com $home['username']
.
Hash do diretório inicial com fallback
Na maioria das vezes, seria melhor ter um "padrão de fallback" se o usuário não existir no hash. Em teoria isso é possível, embora a sintaxe se torne um pouco enigmática e inchada:
$home = { ... }
$default_home = '/home'
user {$username:
home => has_key($home, $username) ? {
true => $home[$username],
false => "${default_home}/${username}"
}
# ...
}