我的第一个想法是做这样的事情:
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 。 也许有:
有没有人有任何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:
如果你决定采用这种方式,通过使用create_resources函数和Hiera ,你仍然可以获得很多好处
在这种情况下,对于可选参数来说,有一个不太好的方法。
my_user($ensure = 'present', $uid = undef) { if $uid != undef { User { uid => $uid } } user { $name: ensure => $ensure } }
您只需在define的范围内为user分配资源缺省值。 您可以重复使用任意数量的参数。