La séparation configs de WAR / EAR pour les déploiements Puppet
-
27-10-2019 - |
Question
Nous faisons beaucoup de déploiements d'applications Java Web aux serveurs Weblogic et Jboss. Très souvent, les regards de déploiement comme celui-ci:
-
Copiez le code et par défaut configs à un répertoire de mise en scène sur le serveur d'applications ou Weblogic serveur d'administration.
-
Modifier un fichier de propriétés pour définir les variables d'environnement spécifiques (adresses IP, noms d'utilisateur, etc.)
-
Exécuter ant pour créer l'oreille / guerre et déposez-le dans le répertoire approprié.
-
Démarrer les services
est avéré être un ensemble très désagréable d'étapes à utiliser avec des marionnettes comme outil de gestion de configuration. Nous préférerions un processus qui est beaucoup plus semblable au paquet, fichier, service de tiercé gagnant de marionnettes, mais d'avoir à configurer les propriétés avant de construire l'oreille / guerre rend cette difficile car il nécessite une étape supplémentaire pour construire la guerre / l'oreille sur la hôte après les propriétés ont été renseignés.
Y at-il un moyen de construire une guerre / oreille respectueuse de l'environnement agnostique et garder les configurations externes, en supprimant l'étape de construction supplémentaire?
Quelqu'un at-il travaillé spécifiquement avec des applications Web et de marionnettes, et avez-vous des recommandations?
La solution
What I've done with tomcat and .war webapps is build a system package with an unzipped war and then deal with the conf files. I haven't dealt with Weblogic much or JBoss at all, so I don't know how it deals with unzipped WAR stuff.
1) Build a package (RPM) where I do all the .war building stuff, then something like:
mkdir -p %{buildroot}/var/lib/tomcat5/webapps/APP
cd %{buildroot}/var/lib/tomcat5/webapps/APP
unzip ../APP.war
rm ../APP.war
(so that the unzipped .war file is in the package with no actual .war file in there. With tomcat it will then leave that directory alone, especially if it doesn't have write access because the files belong to root)
2) Puppet stuff somewhat like:
package {
"tomcat5":
require => Package["java-1.6.0-sun"],
ensure => installed;
"java-1.6.0-sun":
ensure => installed;
"APP":
ensure => installed,
notify => Service["tomcat5"],
require => Package["java-1.6.0-sun"];
}
file {
"/usr/share/tomcat5/webapps/APP":
source => [ "puppet:///MODULE/APP" ],
ensure => directory,
ignore => [ 'CVS', '.git', '.svn', '*~' ], # ignore revision control and backup files
purge => false, # leaves other stuff alone
replace => true, # replaces stock files with ours
recurse => true, # gets everything recursively
require => Package[APP], # install package first
notify => Service[tomcat5]; # restart tomcat after
}
This particular package has 32 files in 8 directories that we're modifying or pushing out to configure it. If it was just a few files, I'd use a couple simple file{}
resources to manage those files instead of the recursive stuff.
If you didn't want to build a system type package, you could do a file{}
resource for the war into an alternate directory, an exec{"unzip ...": creates => '/path/to/unzipped/webapp;}
and have the file{}
resources for configuration require the Exec["unzip ..."]
.