Embora eu saiba a solução imediata para um problema que eu estava enfrentando ontem (graças ao pessoal do IRC #puppet), eu ainda não entendi como isso resolveu o problema, ou melhor, qual é a diferença fundamental entre classes e define neste cenário particular:
O original define, o que estava incorreto:
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: Could not retrieve catalog from
remote server: Error 400 on SERVER:
Duplicate definition: Exec[sleep 5] is
already defined in file
/etc/puppet/modules/common/manifests/defines/srv.pp
at line 4; cannot redefine at
/etc/puppet/modules/common/manifests/defines/srv.pp:4
on node testing.abc.def.com
O correto define:
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,
}
}
Então, por que o erro no primeiro caso? Como eu estou duplicando uma definição ou em outras palavras, se houvesse um único módulo usando essa definição, a primeira definição funcionaria? Talvez seja a terminologia de marionetes nos documentos que me deixou confuso, mas ter escrito uma tonelada de módulos (de trabalho) e não entender isso soa perigoso para mim, espero que eu possa obter algumas respostas claras.