使用 Puppet 强制执行散列主目录权限

使用 Puppet 强制执行散列主目录权限

我们环境中的主目录使用用户名的前两个字母进行哈希处理。例如,用户的主目录lars/home/l/a/lars

我想使用 puppet 强制执行用户主目录的 0700 模式权限,但我不确定如何定位主目录。本质上我想这样做:

chmod 700 /home/*/*/*

在没有散列的情况下,这会很容易(例如使用recurserecurselimit),但是散列让我寻找解决方案。

更新:我并不想在 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 代码片段。

相关内容