虽然我知道我昨天面临的一个问题的直接解决scheme(感谢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, } }
err:无法从远程服务器检索目录:SERVER上的错误400:重复的定义:Exec [sleep 5]已经在第4行的/etc/puppet/modules/common/manifests/defines/srv.pp文件中定义; 无法在节点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, } }
那么,为什么在第一种情况下的错误? 我如何复制一个定义,换句话说,如果有一个单一的模块使用这个定义,那么将有第一个定义工作? 也许它的文档中的傀儡术语让我感到困惑,但是写了大量的(工作)模块而不理解这个对我来说听起来很危险,希望我能得到一些明确的答案。
Puppet中的资源必须是唯一的,即必须具有唯一的名称。
在所描述的情况下,您在定义中拥有资源Exec["sleep 5"] ,并且每次调用srv (与包含参数化类基本相同)时,资源Exec["sleep 5"]也将被包含因此parsing器会find两个或多个同名的资源。
通过将定义的$name附加到Exec资源的名称,可以使其具有唯一性。 那么,至less最有可能是唯一的,因为当你在清单中的其他地方有另一个同名的资源( Exec["sleep 5 for foo" ))时,你会再次遇到这个错误。