私はいくつかのパペットモジュールを作成していて、2つのモジュールで定義されたパッケージを持っているため、次のエラーが発生します。
err: Could not retrieve catalog from remote server: Error 400 on SERVER: Duplicate definition: Package[gnome-session-fallback] is already defined in file /etc/puppet/modules/vnc4server/manifests/init.pp at line 3; cannot redefine at /etc/puppet/modules/vino/manifests/init.pp:7 on node l
したがって、パッケージがまだ定義されていないが、以下が機能しないことを確認したい:
if ! defined ('gnome-session-fallback') {
package { 'gnome-session-fallback':
ensure => installed,
}
}
誰もがこれを修正する方法を提案できますか、そしてより広いスケールで、モジュール内のこのような衝突を回避するための「適切な」アプローチは何ですか?
Defined()内にPackage []がありません。それを行う正しい方法:
if ! defined(Package['gnome-session-fallback']) {
package { 'gnome-session-fallback':
ensure => installed,
}
}
これを行う最もクリーンな方法は、 puppetlabs-stdlib から_ensure_resource
_関数を使用することです。
ensure_resource('package', 'gnome-session-fallback', {'ensure' => 'present'})
「適切な」アプローチとは何かについての私自身の質問に答えるには、この問題について https://groups.google.com/forum/?fromgroups=#!topic/puppet-users/julAujaVsVk で説明しますjcbollengerは、「ベストプラクティス」のソリューションのように見えるものを提供します。複数回定義されたリソースは、独自のモジュールに移動し、依存するクラスに含める必要があります。これを適用して問題を解決しました。
しかし、「もし!defined」が失敗した理由は実際には答えません...
(複数の方法の中で)よりクリーンな方法の1つは、仮想パッケージリソースを作成して、それを実現することです。エラーなしで同じ仮想パッケージを複数回実現できます。
@package { 'gnome-session-fallback':
ensure => installed,
}
そして、あなたがそれを必要とする場所:
realize( Package[ 'gnome-session-fallback' ] )