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

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

私はユーザー以下のように

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

今、あなたが見ることができるように私はやっている管理ホームが偽です 後で、ユーザーのホーム ディレクトリにファイルをプッシュする必要があります。

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

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

どうすればユーザーのホームディレクトリこのために?

答え1

うーん、それを実行するには Facter モジュールと、ちょっとしたハッキーなマニフェスト ファイルが必要になると思います...

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",
}

おそらくもっと良い方法があるのでしょうが、残念ながらそうではありません。

答え2

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

ホーム ディレクトリを明示的に定義します。例:

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

が false の場合managehome、ホーム ディレクトリは作成されません。そのため、ホーム ディレクトリを具体的に定義する必要があります。多くの場合、ユーザー全体に対してカスタム定義を作成するのが最適です。

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

編集: ハッシュを使用してユーザー固有のホームディレクトリを定義する

username => /path/to/homeより新しい Puppet バージョン (>= 2.6) ではハッシュがサポートされています。各ユーザーのマッピングを含むハッシュを定義することができます。

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

答え3

この質問は古いものですが、まだ関連性があります。実際、今はもっと良い方法があります。カスタムファクトを追加してください[モジュール]/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 の実行前にユーザーがすでに存在している場合にのみ機能することに注意してください。実行中にユーザーが作成される場合、ホーム ディレクトリは既にわかっているか、少なくとも予測可能である必要があります。結局のところ、Puppet は秩序を作成するように設計されています。

これが誰かの役に立つことを願います。

答え4

ときアカウントモジュールが使用可能で、すべてのアカウントが 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は、すべてのユーザーにとって正しいはずです。

  1. で管理されaccounts
  2. 確実にpresent
  3. 非標準homeディレクトリの場合。

関連情報