Puppet:ユーザーのホームディレクトリを取得する


12

私は次のようにユーザーを作成しています

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

、managehomeを実行していることがわかるように、false です。

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

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

ユーザーのホームディレクトリを取得するにはどうすればよいですか?

回答:


11

ふむ、私はあなたがそれをするためのファクトモジュラーと少しハックなマニフェストファイルが必要だと思う...

ファクトモジュール:これにより、すべてのユーザーのファクト変数が登録されます。「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",
}

おそらくより良い方法がありますが、私は恐れていません。


このマニフェストを配置する場所に関するガイダンスを教えてください。init.ppに基本クラスがあり、そこからどこに行きますか?
Quintinのパー

1
@QuintinParパペットのサンプルやベストプラクティスをgithubにアップロードし始めました。あなたはここで、この例(facterクラスを)見つける:github.com/drandor/puppet-examples/tree/master/modules/userは、あなたが持っているpluginsyncご主人とあなたのエージェントに有効にする必要があります。2番目のコードは、*。ppファイルのどこでも使用できます。puppetの構成とノードマニフェスト(ステージ付き)は、github.com
drandor

1
ユーザーがマシン上にまだ存在しない場合(新しいユーザーが追加された場合)、home_userファクトは利用できません。新しいユーザーを作成するには、2回のPuppetの実行が必要になる場合があります。最初の実行では、$ home_pathは空です。これにより、望ましくない結果が生じる可能性があります。
ミッコ

3

私はまったく同じ問題の解決策を見つけようとしましたが、わずかに異なるアプローチを取ることが最善であることがわかりました。

たとえば、ホームディレクトリを明示的に定義します。

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

場合はmanagehomefalseで、ホームディレクトリであっても作成されません。したがって、明確に定義する必要があります。多くの場合、ユーザー全体に対してカスタム定義を作成することが最善です。

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}" 
            }
    # ...
}

2
これは、/ homeがデフォルトではない場合にのみ機能します。say / var / lib / psql
Quintin Par

@Barry:答えの残り、「ユーザー固有のホームディレクトリ」を読みましたか?(答えは、Quintin Parによるコメントの後に編集されました)
ミッコ

@Mikko Yeap、そして私は正しい(受け入れられた)答えを支持しようとしました。ロックされました。

0

この質問は古いですが、まだ関連しています。実際、今より良い方法があります。以下を含むカスタムモジュール[モジュール] /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']

これは、パペットの実行前にユーザーが既に存在する場合にのみ機能することに注意してください。実行中にユーザーが作成される場合、ホームディレクトリは既にわかっているか、少なくとも予測可能である必要があります。結局、Puppetは順序を作成するように設計されています。

これが誰かを助けることを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.