木偶:获取用户主目录


13

我创建一个用户如下

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

我该如何获取用户的主目录

Answers:


12

嗯,我认为您需要一个事实模块来做到这一点,并且需要一个小小的清单文件...

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

也许有更好的方法,但是恐怕没有。


您能给我一些有关将清单放在哪里的指导吗?我在init.pp中有我的基础课,我从那里去哪里?
Quintin Par

1
@QuintinPar我刚刚开始将一些木偶示例或最佳实践上传到github。您将在以下位置找到该示例(事实类):github.com/drandor/puppet-examples/tree/master/modules/user您需要在主服务器和代理上激活pluginsync。第二个代码可以在* .pp文件中的任何位置使用。人偶的配置和节点清单(带有阶段)可以在这里找到:github.com/drandor/puppet-config
jfried

1
如果计算机上尚不存在该用户(已添加新用户),则home_user事实不可用。创建新用户可能需要运行两次Puppet。第一次运行时,$ home_path为空,这可能会导致不良结果。
米科(Mikko)2012年

4

我试图为完全相同的问题找到解决方案,结果发现最好采用稍微不同的方法。

显式定义主目录,例如:

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']

具有备用的主目录哈希

在大多数情况下,如果用户不存在于哈希中,则最好有一个“后备默认值”。从理论上讲,这是可能的,尽管语法变得有点神秘和and肿:

$home = { ... }
$default_home = '/home'

user {$username:
    home => has_key($home, $username) ? {
                true => $home[$username], 
                false => "${default_home}/${username}" 
            }
    # ...
}

2
当/ home不是默认值时,此选项不起作用。说/ var / lib / psql
Quintin Par 2012年

@Barry:您是否阅读了其余的答案,即“用户特定的主目录”?(答案是在Quintin Par评论后编辑的)
Mikko

@Mikko Yeap,我尝试提出正确(可接受)的答案。它已被锁定。

1

这个问题很老,但是仍然很重要。实际上,现在有更好的方法。将自定义事实添加到[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']

请记住,这仅在运行木偶之前用户已经存在的情况下才有效。如果在运行期间创建了用户,则主目录应该是已知的或至少可预测的。毕竟,木偶旨在创建订单。

希望这对某人有帮助。


0

帐户模块可用并且所有帐户都是通过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目录。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.