webentwicklung-frage-antwort-db.com.de

Puppet - Test, ob ein Paket bereits definiert ist?

Ich schreibe einige Marionettenmodule und habe ein Paket in zwei Modulen definiert, daher wird der folgende Fehler angezeigt:

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

Daher möchten Sie sicherstellen, dass das Paket noch nicht definiert wurde, aber Folgendes nicht funktioniert:

if ! defined ('gnome-session-fallback') {
    package { 'gnome-session-fallback':
        ensure => installed,
    }
}

Kann jemand vorschlagen, wie man dies beheben kann, und was ist der "richtige" Ansatz, um Kollisionen in Modulen zu vermeiden?

19
Mr Morphe

Sie vermissen Package [] in defined (). Der richtige Weg, es zu tun:

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

Am einfachsten geht das mit der Funktion ensure_resource Aus puppetlabs-stdlib :

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

13
aetimmes

Zur Beantwortung meiner eigenen Frage nach dem "richtigen" Ansatz: Dieses Thema wird unter https://groups.google.com/forum/?fromgroups=#!topic/puppet-users/julAujaVsVk und jcbollenger in Angeboten behandelt Was wie eine "Best-Practice" -Lösung aussieht - Ressourcen, die mehrfach definiert werden, sollten in ein eigenes Modul verschoben und in die Klassen aufgenommen werden, von denen sie abhängig sind. Ich habe dies angewendet und mein Problem gelöst.

Dies beantwortet eigentlich nicht, warum "if! Defined" jedoch fehlschlägt ...

5
Mr Morphe

Eine sauberere Möglichkeit (unter mehreren Möglichkeiten) besteht darin, eine virtuelle Paketressource zu erstellen und dann zu realisieren. Sie können dasselbe virtuelle Paket mehrmals ohne Fehler realisieren.

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

Und dann wo du es brauchst:

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