Classes & Define em Puppet

5

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.

    
por alcy 10.08.2010 / 07:17

1 resposta

6

Recursos no Puppet têm que ser únicos, i. e. tem que ter um nome único.

No caso descrito, você tinha o recurso Exec["sleep 5"] em sua definição e toda vez que você chama srv (é basicamente o mesmo que incluir uma classe parametrizada), o recurso Exec["sleep 5"] também será incluído e, assim, o o analisador localiza dois ou mais recursos com o mesmo nome.

Ao anexar o $name da definição ao nome do seu recurso Exec , você o torna exclusivo. Bem, pelo menos provavelmente único desde quando você tem outro recurso com o mesmo nome ( Exec["sleep 5 for foo" ) em algum outro lugar em seus manifestos, você encontrará esse erro novamente.

    
por 10.08.2010 / 07:51

Tags