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