私はserを次のように作成しています
user { $username:
comment => "$name",
Shell => "$Shell",
managehome => false,
password => "$password",
groups => $groups
}
これで、uが実行していることがわかりますmanagehomeはfalse次に、レーンを下りて、ユーザーのホームディレクトリにファイルをプッシュする必要があります。
$key = "${homedir}/${name}/file"
file { $key:
ensure => present,
owner => $username,
group => $username,
mode => 600,
content => "$keyvalue",
subscribe => User[$username],
}
どうすればユーザーのホームディレクトリを取得できますか?
うーん、それを行うにはファクサーモジュールと少しハッキーなマニフェストファイルが必要だと思います...
facterモジュール:これは、すべてのユーザーのfacter変数を登録します。 「home_root」や「home_Apache」のように。
require 'etc'
Etc.passwd { |user|
Facter.add("home_#{user.name}") do
setcode do
user.dir
end
end
}
その後、マニフェストファイル内で次のように使用できます。
$username = "root"
$home = "home_$username"
$home_path = inline_template("<%= scope.lookupvar('::$home') %>")
file { "$home_path/test.txt":
content => "huhu",
}
おそらくもっと良い方法がありますが、私はそうではありません。
私はまったく同じ問題の解決策を見つけようとしましたが、少し異なるアプローチを取るのが最善であることがわかりました。
たとえば、ホームディレクトリを明示的に定義します。
user { $username:
comment => "comment",
home => "/home/${username}",
managehome => false,
# ...
}
managehome
がfalseの場合、ホームディレクトリは作成されません。したがって、具体的に定義する必要があります。多くの場合、ユーザー全体のカスタム定義を作成するのが最善です。
define custom_user($username, $password) {
user { $username:
home => "/home/${username}",
password => $password,
# etc.
}
file { "/home/${username}":
ensure => directory,
owner => $username,
require => User[$username],
# etc.
}
}
$keyvalue
などのパラメーターを追加し、そのパラメーターが指定されている場合はキーファイルを作成できます。
グローバル変数$home = "/home"
(必要に応じてOS固有)を定義し、"${home}/${username}"
を使用してホームディレクトリを取得することもできます。
最近のPuppetバージョン(> = 2.6)はハッシュをサポートしています。ユーザーごとにusername => /path/to/home
マッピングを含むハッシュを定義することが可能です。
$home = {
normal_user => '/home/normal_user',
backup => '/var/backup',
mysql => '/var/lib/mysql'
}
ユーザー名については、$home['username']
を使用してホームディレクトリを簡単に取得できます。
フォールバック付きのホームディレクトリハッシュ
ほとんどの場合、ユーザーがハッシュに存在しない場合は、「フォールバックのデフォルト」を使用することをお勧めします。 理論的にはこれは可能ですが、構文は少し不可解で肥大化します:
$home = { ... }
$default_home = '/home'
user {$username:
home => has_key($home, $username) ? {
true => $home[$username],
false => "${default_home}/${username}"
}
# ...
}
この質問は古いですが、まだ関連しています。実際には今より良い方法があります。以下を含むカスタムファクトを[module] /lib/facter/home_dirs.rbに追加します。
require 'etc'
Facter.add(:home_dirs) do
setcode do
home_dirs = {}
Etc.passwd { |user|
home_dirs[user.name] = user.dir
}
home_dirs
end
end
次に、マニフェストのデータにアクセスできます。
$facts['home_dirs']['some_username']
これは、パペットを実行する前にユーザーがすでに存在している場合にのみ機能することに注意してください。実行中にユーザーが作成される場合、ホームディレクトリは既知であるか、少なくとも予測可能である必要があります。結局のところ、人形は秩序を生み出すように設計されています。
これが誰かを助けることを願っています。
accounts モジュールが利用可能で、すべてのアカウントがhieraを介して作成されている場合、以下のブロックは、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],
}
}
$user_home_dir
は、
accounts
で管理present
home
ディレクトリの場合。