web-dev-qa-db-fra.com

Marionnette - tester si un paquet est déjà défini?

J'écris des modules de marionnettes et un paquet est défini dans deux modules, d'où l'erreur suivante:

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

Par conséquent, vous voulez vous assurer que le paquet n'a pas déjà été défini mais que ce qui suit ne fonctionne pas:

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

Quelqu'un peut-il suggérer comment résoudre ce problème et, à une plus grande échelle, quelle est la "bonne" approche pour éviter des conflits de ce type dans les modules?

19
Mr Morphe

Il vous manque Package [] à l'intérieur de defined (). La bonne façon de le faire:

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

Pour répondre à ma propre question sur l'approche "appropriée": Cette question est traitée à l'adresse suivante: https://groups.google.com/forum/?fromgroups=#!topic/puppet-users/julAujaVsVk et jcbollenger ce qui ressemble à une solution "de meilleure pratique" - les ressources qui sont définies plusieurs fois doivent être déplacées dans leur propre module et incluses dans les classes dont elles dépendent. J'ai appliqué cela et résolu mon problème.

Cela ne répond pas réellement pourquoi "si! Défini" échoue cependant ...

5
Mr Morphe

Une méthode plus simple (parmi plusieurs méthodes) consiste à créer une ressource de package virtuel, puis à la réaliser. Vous pouvez réaliser le même paquet virtuel plusieurs fois sans erreur.

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

Et puis là où vous en avez besoin:

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