19

私はいくつかのパペットモジュールを書いていて、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,
    }
}

誰かがこれを修正する方法を提案できますか、そしてより広いスケールで、モジュールでこのような衝突を回避するための「適切な」アプローチは何ですか?

4

4 に答える 4

46

defined()内にPackage[]がありません。それを行う正しい方法:

if ! defined(Package['gnome-session-fallback']) {
    package { 'gnome-session-fallback':
        ensure => installed,
    }
}
于 2013-03-09T23:13:39.870 に答える
13

これを行う最もクリーンな方法は、 puppetlabs-stdlibensure_resourceの関数を使用することです。

ensure_resource('package', 'gnome-session-fallback', {'ensure' => 'present'})

于 2014-06-09T19:34:36.603 に答える
5

「適切な」アプローチとは何かについての私自身の質問に答えるには:この問題はhttps://groups.google.com/forum/?fromgroups=#!topic/puppet-users/julAujaVsVkで議論されており、jcbollengerは「ベストプラクティス」ソリューション-複数回定義されたリソースは、独自のモジュールに移動し、依存するクラスに含める必要があります。これを適用して問題を解決しました。

しかし、これは「if!defined」が失敗する理由に実際には答えません...

于 2013-03-07T13:58:46.717 に答える
1

(複数の方法の中で)よりクリーンな方法の1つは、仮想パッケージリソースを作成し、それを実現することです。同じ仮想パッケージをエラーなしで複数回実現できます。

@package { 'gnome-session-fallback':
    ensure => installed,
}

そして、あなたがそれを必要とするところ:

realize( Package[ 'gnome-session-fallback' ] )
于 2016-10-24T18:28:25.893 に答える