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

嗯,我認為你需要一個因素模組來做到這一點,還有一些駭客清單檔案...

因素模組:這將為所有用戶註冊因素變數。例如“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"(特定於作業系統,如果需要)並使用"${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}" 
            }
    # ...
}

答案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 的設計初衷就是為了創造秩序。

希望這對某人有幫助。

答案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目錄。

相關內容