
Obwohl ich die unmittelbare Lösung für ein Problem kenne, mit dem ich gestern konfrontiert war (danke an die Leute bei IRC #puppet), verstehe ich immer noch nicht, wie das Problem dadurch gelöst wurde, oder vielmehr, was der grundlegende Unterschied zwischen Klassen und Definitionen in diesem speziellen Szenario ist:
Die ursprüngliche Definition, die falsch war:
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,
}
}
Fehler: Katalog konnte nicht vom Remote-Server abgerufen werden: Fehler 400 auf dem SERVER: Doppelte Definition: Exec[sleep 5] ist bereits in der Datei /etc/puppet/modules/common/manifests/defines/srv.pp in Zeile 4 definiert; kann unter /etc/puppet/modules/common/manifests/defines/srv.pp:4 auf dem Knoten testing.abc.def.com nicht neu definiert werden.
Die richtige Definition:
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,
}
}
Warum also der Fehler im ersten Fall? Wie dupliziere ich eine Definition oder anders ausgedrückt: Wenn es ein einzelnes Modul gäbe, das diese Definition verwendet, hätte dann die erste Definition funktioniert? Vielleicht ist es die Puppet-Terminologie in den Dokumenten, die mich verwirrt hat, aber nachdem ich eine Menge (funktionierender) Module geschrieben habe und dies nicht verstehe, klingt es für mich gefährlich. Ich hoffe, ich kann einige klare Antworten bekommen.
Antwort1
Ressourcen in Puppet müssen eindeutig sein, d. h. einen eindeutigen Namen haben.
Im beschriebenen Fall hatten Sie die Ressource Exec["sleep 5"]
in Ihrer Definition und bei jedem Aufruf srv
(das ist im Grunde dasselbe wie das Einbinden einer parametrisierten Klasse) Exec["sleep 5"]
wird die Ressource auch einbezogen, sodass der Parser zwei oder mehr Ressourcen mit demselben Namen findet.
$name
Indem Sie den der Definition an den Namen Ihrer Ressource anhängen Exec
, machen Sie sie eindeutig. ZumindesthöchstwahrscheinlichExec["sleep 5 for foo"
eindeutig, da dieser Fehler erneut auftritt, wenn Sie an einer anderen Stelle in Ihren Manifesten eine andere Ressource mit demselben Namen () haben .