Puppet:获取用户主目录

Puppet:获取用户主目录

我正在创建一个用户如下

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

我如何获得用户的主目录为了这?

答案1

嗯,我认为你需要一个 factor 模块来做到这一点和一个小的清单文件......

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

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"(如果需要,特定于操作系统)并使用获取主目录"${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 运行之前已经存在时才有效。如果在运行期间创建用户,则主目录应该是已知的或至少是可预测的。毕竟,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目录。

相关内容