web-dev-qa-db-ja.com

Puppet-パッケージがすでに定義されているかどうかをテストしますか?

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

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

19
Mr Morphe

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

if ! defined(Package['gnome-session-fallback']) {
    package { 'gnome-session-fallback':
        ensure => installed,
    }
}
46
Gergo Erdosi

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

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

13
aetimmes

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

しかし、「もし!defined」が失敗した理由は実際には答えません...

5
Mr Morphe

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

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

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

realize( Package[ 'gnome-session-fallback' ] )