有没有办法让木偶创build一个用户的家庭文件夹(managehome),但确保“缺席”时不删除?

我的第一个想法是做这样的事情:

define my_user( $name = $title, $ensure = present, $uid, $gid, $password, $groups, $comment, $shell ) { $managehome = $ensure ? { present => true, default => false, } user { $name: ensure => $ensure, managehome => $managehome, uid => $uid, gid => $gid, password => $password, groups => $groups, comment => $comment, shell => $shell, } } 

有几个这样的问题:

  • 如果我想使用另一个usertypes属性,我需要在两个地方更改my_user
  • 我将需要更改所有user声明以使用my_user
  • 我宁愿使用一个内置的types,然后是一个定义的types。

也许有:

  • 将所有参数捕获到已定义的types并将其作为属性传递给内置types的一种方法。
  • 一个更优雅的方式来做到这一点,而不使用定义的types。

有没有人有任何build议?

有几种方法可以处理这个问题,你可以直接在用户声明中使用你的三元检查,如下所示:

 user { $user: ensure => $ensure, managehome => $ensure ? { present => true, default => false, }, uid => $uid, gid => $gid, password => $password, groups => $groups, comment => $comment, shell => $shell, } 

这是假设你正在参数化你的价值在这里,我猜这不一定是这样的。 你仍然有问题,不得不更新所有你可能有点痛苦的types引用。 相反,你可以使用更强大的东西, create_resources函数。 考虑一下傀儡文件的摘录如下:

 class profile::base { $user_params = { 'user1' => { ensure => absent, managehome => false, uid => '1337', gid => dev, }, 'user2' => { uid => '1338', gid => ops, groups => ['wheel', 'company'], }, } $user_defaults = { ensure => present, managehome => true, groups => ['users', 'company'], comment => 'Managed by puppet', shell => '/bin/bash', } create_resources(user, $user_params, $user_defaults) ... } 

那么在这里发生的是,create_resources函数使用散列$ user_params,并使用提供的参数dynamic地为每个条目创build一个资源。 此外, $ user_params不提供的任何参数使用$ user_defaults哈希中的值。 上面的代码有效地评估到以下片段。 (如果你不熟悉create_resources函数,我强烈推荐在这里阅读)

 class profile::base { user { 'user1': ensure => absent, managehome => false, uid => 1337, gid => dev, groups => ['users', 'company'], comment => 'Managed by puppet', shell => '/bin/bash', } user { 'user2': ensure => present, managehome => true, uid => 1338, gid => ops, groups => ['wheel', 'company'], comment => 'Managed by puppet', shell => '/bin/bash', } ... } 

这使您可以快速添加/更改您想要pipe理的所有用户的属性,而无需查找每个参考。 说如果你想切换到公司使用ksh你只需改变user_defaults哈希值来反映这一点。 也没有任何东西阻止你有不同的参数组和默认值(比如你的超级用户使用$ root_params和$ root_defaults),并且有另一个create_resources函数调用。

进一步考虑这个想法,你可以将这个概念与来自Hiera的数据配对。然后,解决scheme将如下所示:

 class profile::base { $user_params = hiera("user-params") $user_defaults = hiera("user-defaults") create_resources(user, $user_params, $user_defaults) ... } 

更清洁,更容易阅读。 相应的hieradata json文件如下所示:

 { "user-params": { "user1": { "ensure": "absent", "managehome": "false", "uid": "1337", "gid": "dev" }, "user2": { "uid": "1338", "gid": "ops", "groups": ["wheel", "company"] } }, "user_defaults": { "ensure": "present", "managehome": "true", "groups": ["users", "company"], "comment": "Managed by puppet", "shell": "/bin/bash" } } 

我个人比较喜欢JSON,但是YAML也是一个可行的选项( Hiera Data Sources )关于Hiera的好处在于,您可以根据您在hiera.yaml文件中决定和configuration的任何标准使用不同的数据源环境,但可能是每个节点)

作为最后的想法,您可能需要考虑编写一个自定义types来包装用户types:

  • 如果确保=>不存在,则归档用户的主目录
  • 如果确保=>存在,search并恢复已存档的目录
  • 正常使用内置的用户types和managehome => true

如果你决定采用这种方式,通过使用create_resources函数和Hiera ,你仍然可以获得很多好处

在这种情况下,对于可选参数来说,有一个不太好的方法。

 my_user($ensure = 'present', $uid = undef) { if $uid != undef { User { uid => $uid } } user { $name: ensure => $ensure } } 

您只需在define的范围内为user分配资源缺省值。 您可以重复使用任意数量的参数。