
Embora eu saiba a solução imediata para um problema que enfrentei ontem (graças ao pessoal do IRC #puppet), ainda não entendo como isso resolveu o problema, ou melhor, qual é a diferença fundamental entre classes e define neste particular cenário:
A definição original, que estava incorreta:
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: Não foi possível recuperar o catálogo do servidor remoto: Erro 400 no SERVIDOR: Definição duplicada: Exec[sleep 5] já está definido no arquivo /etc/puppet/modules/common/manifests/defines/srv.pp na linha 4; não é possível redefinir em /etc/puppet/modules/common/manifests/defines/srv.pp:4 no nó testing.abc.def.com
A definição correta:
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 estou duplicando uma definição ou em outras palavras, se houvesse um único módulo usando esta definição, a primeira definição teria funcionado? Talvez seja a terminologia fantoche nos documentos que me deixou confuso, mas ter escrito uma tonelada de módulos (funcionais) e não entender isso parece perigoso para mim, espero poder obter algumas respostas claras.
Responder1
Os recursos no Puppet devem ser únicos, ou seja, devem ter um nome exclusivo.
No caso descrito, você tinha o recurso Exec["sleep 5"]
na sua definição e toda vez que você chamar srv
(é basicamente o mesmo que incluir uma classe parametrizada), o recurso Exec["sleep 5"]
também será incluído e assim o analisador encontra dois ou mais recursos com o mesmo nome.
Ao anexar o $name
da definição ao nome do seu Exec
recurso, você o torna único. Bem, pelo menosprovavelmenteexclusivo, pois quando você tiver outro recurso com o mesmo nome ( Exec["sleep 5 for foo"
) em algum outro lugar dos seus manifestos, você encontrará esse erro novamente.