可选地将参数传递给puppet资源

可选地将参数传递给puppet资源,puppet,Puppet,是否有一种方法仅在设置了参数后才将其传递给puppet资源?例如,假设我有一个创建新用户的清单,我可能希望也可能不希望手动设置uid和gid。我能想到的最好办法是: class example ( $uid = undef, $gid = undef, $username = 'default' ) { user { $username: ensure => present, # etc }

是否有一种方法仅在设置了参数后才将其传递给puppet资源?例如,假设我有一个创建新用户的清单,我可能希望也可能不希望手动设置uid和gid。我能想到的最好办法是:

class example (
    $uid      = undef,
    $gid      = undef,
    $username = 'default'
) {
    user { $username:
        ensure => present,
        # etc
    }

    if $uid != undef {
        user { "uid-${username}":
            name    => $username,
            uid     => $uid,
            require => User[$username]
        }
    }

    if $gid != undef {
        user { "gid-${username}":
            name    => $username,
            gid     => $gid,
            require => User[$username]
        }
    }
}

但是,仅仅为了确定是否发送uid和/或gid,就需要编写大量代码。有更好的方法吗?

我认为由于多个声明,您的示例将无法编译,因为
user
资源上的
name
是检查唯一性的对象。话虽如此,在我看来,有两种方法可以让它稍微好一点

第一种方法涉及属性修改:

...
user { $username:
    ensure => present,
    # etc
}

if $uid != undef {
    User[$username] { uid => $uid }
}

if $gid != undef {
    User[$username] { gid => $gid }
}
第二个涉及从散列设置属性:

class example (
    Hash $id         = {},
    String $username = 'default'
) {
    user { $username:
        ensure => present,
        *      => $id,
        # etc
    }
}
然后在via声明中传递附加参数:

class example { 'foo':
  username => 'bar',
  id       => { uid => 1000, gid => 1000 }
}
或使用类似于以下内容的自动Hiera查找:

example::id:
  uid: 1000
  gid: 1000
请注意,在任何情况下(声明或Hiera),不指定
id
,仍将导致
用户
资源的正确和预期行为,而不改变
uid
gid


您可以在中找到这两种方法的文档,甚至可以从该文档中找到另外一两种方法。

哈希设置正是我所要查找的。谢谢你的链接!