Estou criando umdo utilizadorcomo se segue
user { $username:
comment => "$name",
shell => "$shell",
managehome => false,
password => "$password",
groups => $groups
}
Agora, como você pode ver, estou fazendoum managerhome é falso Agora, mais tarde, preciso enviar um arquivo para o diretório inicial do usuário.
$key = "${homedir}/${name}/file"
file { $key:
ensure => present,
owner => $username,
group => $username,
mode => 600,
content => "$keyvalue",
subscribe => User[$username],
}
Como posso obter odiretório inicial do usuáriopor esta?
Responder1
Hm, acho que você precisará de um módulo facter para fazer isso e de um pequeno arquivo de manifesto hacky ...
Módulo facter: Isso registrará variáveis facter para todos os usuários. como "home_root" ou "home_apache".
require 'etc'
Etc.passwd { |user|
Facter.add("home_#{user.name}") do
setcode do
user.dir
end
end
}
e então você pode usá-los dentro do seu arquivo de manifesto assim:
$username = "root"
$home = "home_$username"
$home_path = inline_template("<%= scope.lookupvar('::$home') %>")
file { "$home_path/test.txt":
content => "huhu",
}
Talvez haja uma maneira melhor, mas infelizmente não.
Responder2
Tentei encontrar uma solução exatamente para o mesmo problema e descobri que é melhor adotar 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 mesmo é 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 sistema operacional, se necessário) e obter o diretório inicial com "${home}/${username}"
.
Editar: usando 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
mapeamentos 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 obter o diretório inicial com $home['username']
.
Hash do diretório inicial com substituto
Na maioria das vezes, seria melhor ter um "padrão substituto" se o usuário não existir no hash.Em teoriaisso é 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}"
}
# ...
}
Responder3
Esta questão é antiga, mas ainda relevante. Na verdade, existe uma maneira melhor agora. Adicione um fato personalizado a[módulo]/lib/facter/home_dirs.rbcontendo o seguinte:
require 'etc'
Facter.add(:home_dirs) do
setcode do
home_dirs = {}
Etc.passwd { |user|
home_dirs[user.name] = user.dir
}
home_dirs
end
end
Então você pode acessar os dados no manifesto desta forma:
$facts['home_dirs']['some_username']
Lembre-se de que isso só funciona se o usuário já existir antes da execução da marionete. Se o usuário estiver sendo criado durante a execução, o diretório inicial já deverá ser conhecido ou pelo menos previsível. Afinal, o Puppet foi projetado para criar ordem.
Espero que isso ajude alguém.
Responder4
Quando ocontasO módulo está disponível e todas as contas são criadas via hiera, então o bloco abaixo cria um arquivo no diretório inicial de cada usuário, assumindo que você não se importa com contas de usuário do sistema além de root.
require accounts::user::defaults
# filter out accounts with ensure=absent or managehome=false
$managed_accounts = $accounts::user_list.filter |$name, $account| {
(!has_key($account, 'managedhome') or $account['managedhome']) and (!has_key($account, 'ensure') or $account['ensure']!='absent')
}
# Add a file to each users
$managed_accounts.each |$name, $account| {
$user_home_dir = has_key($account, 'home') ? {
true => $account['home'],
default => $name ? {
'root' => $accounts::user::defaults::root_home,
default => $accounts::user::defaults::home_template.sprintf($name),
},
}
# Push a file to the user’s home directory.
file { "${user_home_dir}/.helloworld":
ensure => file,
owner => $name,
content => "Hi ${name}",
require => User[$name],
}
}
O $user_home_dir
deve estar correto para todos os usuários que estão
- gerenciado com
accounts
, - estão garantidos para serem
present
home
para diretórios não padrão .