我们环境中的主目录使用用户名的前两个字母进行哈希处理。例如,用户的主目录lars
是/home/l/a/lars
。
我想使用 puppet 强制执行用户主目录的 0700 模式权限,但我不确定如何定位主目录。本质上我想这样做:
chmod 700 /home/*/*/*
在没有散列的情况下,这会很容易(例如使用recurse
和recurselimit
),但是散列让我寻找解决方案。
更新:我并不想在 puppet 中枚举我们的用户(因为主目录是作为我们帐户管理过程的一部分创建的)。
在思考这个问题的时候,我也变得更加困惑。即使我们的主目录没有经过哈希处理,我该如何让 puppet 将权限应用于内容目录而不影响顶级目录本身?我在想这样的事情:
file { '/home:
ensure => directory,
mode => 0700,
recurse => true,
recurselimit => 1,
}
但这会将模式应用于两者/home
及其直接内容。模式 700 开启/home/lars
没问题。模式 700 开启/home
是个大问题。这可能吗?
答案1
看来您遇到了 Puppet 的一个限制。我只需编写一个 shell 脚本即可解决此问题。
另一个可能的解决方案是为 puppet 编写一个插件,这样你就可以使用新的数据类型(例如 file_wildcard)或类似的东西。在 ruby 上编写一个插件应该可以,但我从未这样做过。
答案2
Puppet 无法识别文件类型中的通配符。如果您使用如下内容:
file { "/home/*":
ensure => directory,
owner => $username,
group => $username,
mode => 700,
require => [ User[$username], Group[$username] ]
}
它将创建/home/\*
文件夹。
因此,您必须创建所需的目录结构,如下所示:
define add_user ( $fullname, $uid ) {
$username = $title
$firstletter = regsubst($username, '(.).*', '\1')
$secondletter = regsubst($username, '.(.).*', '\1')
user { $username:
comment => "$fullname",
home => "/home/$firstletter/$secondletter/$username",
shell => "/bin/bash",
uid => $uid,
require => [ File["/home/$firstletter"], File["/home/$firstletter/$secondletter"] ]
}
group { $username:
gid => $uid,
require => User[$username]
}
file { "/home/$firstletter":
ensure => directory,
owner => root,
group => root,
mode => 755
}
file { "/home/$firstletter/$secondletter":
ensure => directory,
owner => root,
group => root,
mode => 755,
require => File["/home/$firstletter"]
}
file { "/home/$firstletter/$secondletter/$username":
ensure => directory,
owner => $username,
group => $username,
mode => 700,
require => [ File["/home/$firstletter/$secondletter"], User[$username], Group[$username] ]
}
file { "/home/$firstletter/$secondletter/$username/.ssh":
ensure => directory,
owner => $username,
group => $username,
mode => 700,
require => File["/home/$firstletter/$secondletter/$username"]
}
# now make sure that the ssh key authorized files is around
file { "/home/$firstletter/$secondletter/$username/.ssh/authorized_keys":
ensure => present,
owner => $username,
group => $username,
mode => 600,
require => File["/home/$firstletter/$secondletter/$username"]
}
}
并使用以下命令调用它:
node 'test_node' {
add_user { lars:
fullname => "Larry Page",
uid => 510
}
}
答案3
您需要向 puppet 声明希望 Puppet 管理的文件资源(Puppet 是一种声明性语言......)或者使用执行键入以执行您提供的 chmod 代码片段。