Puppet 中的类和定义

Moh*_*wla 5 puppet

尽管我知道我昨天面临的问题的直接解决方案(感谢 IRC #puppet 上的人们),但我仍然不明白它是如何解决问题的,或者更确切地说,在这个特定的类和定义之间的根本区别是什么设想:

原来的定义,这是不正确的:

define srv($name,$enable="true",$ensure="running",$provider="runit",$hasstatus="true",$hasrestart="true"){

                exec {"sleep 5": path=>"/usr/bin:/usr/sbin:/bin:/sbin", before=>Service["$name"],}

                service{"$name":

                    enable=>$enable,
                    ensure=>$ensure,
                    provider=>$provider,
                    hasstatus=>$hasstatus,
                    hasrestart=>$hasrestart,
                } 
                              }
Run Code Online (Sandbox Code Playgroud)

错误:无法从远程服务器检索目录:服务器上的错误 400:重复定义:Exec[sleep 5] 已在文件 /etc/puppet/modules/common/manifests/defines/srv.pp 第 4 行中定义;无法在节点 testing.abc.def.com 上的 /etc/puppet/modules/common/manifests/defines/srv.pp:4 重新定义

正确定义:

define srv($enable="true",$ensure="running",$provider="runit",$hasstatus="true",$hasrestart="true"){

                exec {"sleep 5 for $name": command=>"sleep 5", path=>"/usr/bin:/usr/sbin:/bin:/sbin", before=>Service["$name"],}

                service{"$name":

                    enable=>$enable,
                    ensure=>$ensure,
                    provider=>$provider,
                    hasstatus=>$hasstatus,
                    hasrestart=>$hasrestart,
                }
                              }
Run Code Online (Sandbox Code Playgroud)

那么,为什么在第一种情况下会出现错误?我如何复制定义,或者换句话说,如果有一个使用此定义的模块,那么第一个定义将起作用?也许是文档中的 puppet 术语让我感到困惑,但是编写了大量(工作)模块并且不理解这对我来说听起来很危险,希望我能得到一些明确的答案。

jos*_*chi 6

Puppet 中的资源必须是唯一的,即必须具有唯一的名称。

在所描述的情况下,您Exec["sleep 5"]的定义中有资源,每次调用时 srv(与包含参数化类基本相同),资源Exec["sleep 5"]也将被包含在内,因此解析器会找到两个或多个具有相同名称的资源。

通过将$name定义的附加到您的Exec资源名称,您可以使其独一无二。好吧,至少很可能是唯一的,因为当您Exec["sleep 5 for foo"在清单的其他地方有另一个具有相同名称 ( ) 的资源时,您将再次遇到此错误。