2 votes

Utiliser un fichier local comme modèle de marionnette

Je suis développeur d'un logiciel Java et j'essaie de trouver un moyen intelligent de distribuer et configurer mon application dans notre datacenter. Pour cela, j'ai construit un package rpm et nous avons mis en place un satellite. Le système d'exploitation cible est Red Hat Enterprise. Pour la gestion de la configuration, nous utilisons Puppet.

Jusqu'à présent, tout fonctionne bien. Nous définissons les chaînes de connexion à la base de données et les noms d'hôtes en fonction des configurations des nœuds dans Puppet. Celles-ci vont dans des fichiers de modèle erb que nous avons également dans le maître Puppet.

Mais maintenant, j'ai besoin de patcher un seul fichier qui fait partie du RPM. Il s'agit d'un fichier généré lors de la construction et qui change à chaque construction, nous n'aimons donc pas le mettre dans Puppet. Il y a un identifiant dedans (choisi librement, comme <%baseURL%>). Malheureusement, nous devons définir une URL de base dans ce fichier qui dépend du nœud où il se trouve. J'ai pensé à mettre notre fichier dans le RPM en tant que .erb, mais il semble que Puppet ne puisse pas utiliser de fichiers locaux du système cible en tant que modèles, dans tous les exemples que j'ai vus, les modèles sont situés sur le maître Puppet.

L'autre problème est que la transformation du modèle en fichier de configuration réel doit se faire si le package est mis à jour ou si la configuration baseUrl change.

J'aimerais utiliser le templating Puppet pour cela, mais je ne suis pas sûr que cela fonctionne.

Ma solution actuelle est la suivante : J'utilise Puppet pour créer un fichier dépendant du nœud sur chaque machine dans /etc/myapp/webstart_baseurl. Il ressemble à :

MYAPP_WEBSTART_BASEURL=http\\:\\/\\/10.12.1.42\\/myapp_ws\\/
export MYAPP_WEBSTART_BASEURL

Ensuite, j'ai écrit un script shell que j'ai inclus dans mon RPM. Celui-ci est placé dans /usr/bin/patchHostnameForWebstart.sh

#!/bin/sh

# fichier où charger l'URL de base (dans la propriété $MYAPP_WEBSTART_BASEURL)
MYAPP_WEBSTART_SERVERCONFIG=/etc/myapp/webstart_baseurl

MYAPP_JNLP_TOKEN=@@myapp.webstart.baseurl@@

if [ -f $MYAPP_WEBSTART_SERVERCONFIG ]
then
    source $MYAPP_WEBSTART_SERVERCONFIG
    echo "configuration trouvée pour le serveur webstart, l'URL de base est $MYAPP_WEBSTART_BASEURL"
    echo "remplacement des jetons MYAPP_JNLP_TOKEN .."

    find /var/www/html/myapp_ws -name *.jnlp -print -exec sed -i  "s/${MYAPP_JNLP_TOKEN}/${MYAPP_WEBSTART_BASEURL}/g" {} \;
    echo "les jetons d'URL de tous les fichiers .jnlp dans /var/www/html/myapp_ws ont été traités"

else
    echo "ATTENTION! aucune configuration pour le serveur webstart trouvée, l'URL de base des fichiers .jnlp pourrait ne pas être définie"
    exit 1

fi

Le fait de séparer le script de Puppet présente l'avantage qu'il peut être exécuté directement lors de l'installation du rpm ainsi que depuis Puppet en cas de modification de la configuration de baseUrl.

Cependant, les inconvénients de cette solution sont que j'ai dû implémenter la substitution moi-même et que je dois écrire la configuration baseUrl de cette manière très laide, en double cotation avec beaucoup de barres obliques inverses. Je pense que ceci est assez sujet aux erreurs si quelqu'un d'autre devait le modifier.

Toute suggestion d'amélioration serait la bienvenue. Merci d'avance

Michel

3voto

Ed Ball Points 1341

La marionnette peut utiliser des informations locales.. Si vous écrivez un script facter qui définit un fait.. vous pouvez faire référence à cette valeur depuis l'intérieur de la marionnette.

Exemple

$ facter puppetversion
2.6.4

Je peux utiliser $ puppetversion dans mon modèle ou fichier pp pour obtenir 2.6.4. Écrire un script facter est assez simple et vous pouvez utiliser la marionnette pour distribuer le script facter à l'endroit correct afin que lorsque vous exécutez facter, il l'ajoute à la liste.

http://projects.puppetlabs.com/projects/1/wiki/Adding_Facts

0voto

Daniel C. Sobral Points 5453

Pourquoi ne pas exécuter un script perl pour le patcher?

$baseURL = "/chemin/avec/$fait/à/l'intérieur"
exec { "perl -p -i.bak -e 's^\Q<% baseURL %>\E^$baseURL^' /chemin/vers/le/fichier":
    onlyif  => "grep -q '<% baseURL %>' /chemin/vers/le/fichier",
    require => Package['votrerpme'],
}

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