2 votes

Éviter la duplication de manifeste Puppet

Je dispose d'un ensemble de fichiers de configuration qui doivent être déployés sur plusieurs emplacements sur chaque serveur, chacun avec un contenu différent, cependant ils partagent tous la même structure d'emplacement. J'essaie de réduire la quantité de réplication dans mes manifestes en créant une classe commune qui peut être utilisée plusieurs fois.

Voici un exemple simplifié des structures de fichiers:

/home/bob/config/files.cfg
/home/bob/config/settings.cfg

/home/sue/config/files.cfg
/home/sue/config/settings.cfg

/home/ann/config/files.cfg
/home/ann/config/settings.cfg

Et voici le manifeste que j'ai écrit.

class config-generic {
    file { "/home/$name/config/files.cfg":
        owner =>    $name,
        group =>    $name,
        source =>   "puppet://puppet.domain.com/files/home/$name/config/files.cfg",
        mode =>     644,
    }
    file { "/home/$name/config/settings.cfg":
        owner =>    $name,
        group =>    $name,
        source =>   "puppet://puppet.domain.com/files/home/$name/config/settings.cfg",
        mode =>     644,
    }
}

Lors de la première utilisation de la classe, cela fonctionne bien.

node "client1", "client2" {
    class {'config-generic':
        name  => 'bob',
    }
}

Cependant, lorsque je viens à utiliser la classe à nouveau, une erreur se produit car la classe est déjà définie.

(Erreur 400 sur le SERVEUR : La définition en double : La classe [config-generic] est déjà définie)

node "client1", "client2" {

    class {'config-generic':
        name  => 'bob',
    }

    class {'config-generic':
        name  => 'sue',
    }
}

Question: Je comprends le problème - cependant, quelle est une meilleure façon de réduire la réplication dans mes manifestes? J'essaie d'éviter de devoir définir une entrée 'fichier' pour chaque utilisateur pour chaque fichier.

4voto

raphink Points 10967

Ce dont vous avez besoin n'est pas une classe, mais une définition, car vous voulez en créer plusieurs instances, quelque chose comme :

define config-générique ($ensure=présent) {
    file { "/home/$name/config/files.cfg":
        ensure  =>  $ensure,
        owner   =>  $name,
        group   =>  $name,
        source  =>  "puppet://puppet.domain.com/files/home/$name/config/files.cfg",
        mode    =>  '0644',
    }
    file { "/home/$name/config/settings.cfg":
        ensure  =>  $ensure,
        owner   =>  $name,
        group   =>  $name,
        source  =>  "puppet://puppet.domain.com/files/home/$name/config/settings.cfg",
        mode    =>  '0644',
    }
}

et l'appeler avec :

nœud "client1", "client2" {

    config-générique {
      'bob':;    
      'sue':;
    }
}

Vous voudrez peut-être également utiliser un modèle s'il n'y a que de petites différences, au lieu de dupliquer les fichiers sources.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X