Eu gostaria muito de empacotar o aplicativo como um pacote RPM ou .deb e construir um repositório yum ou apt para armazenar os pacotes. O empacotamento de um tarball ou zip que você está abrindo em um diretório é bem fácil (mas deve ser uma questão separada). A embalagem disponível dessa forma rastreia as versões bem e lida com todos os tipos de coisas que apenas abrir um arquivo não funciona bem.
Se eu realmente não conseguisse criar um pacote adequado, faria algo assim:
nodes.pp:
node 'server1.domain.com' inherits basenode {
apps { apps:
version => 56,
oldversion => 55,
apps_name => "apps_tarball.tgz",
}
init.pp (modules):
file {
[ "/usr/local/apps/path/apps-version-${oldversion}", "/tmp/${oldversion}-${apps_name}" ]:
recurse => true,
ensure => absent;
}
exec {
"apps_wget_${apps_name}":
command => "/usr/bin/wget http://web_server/${version}-${apps_name} -O /tmp/${container_zip_name}",
logoutput => on_failure,
creates => "/tmp/${version}-${apps_name}",
require => [ Package["wget"] ];
"apps_unzip_${apps_name}":
cwd => "/usr/local/apps/path",
command => "/usr/bin/unzip /tmp/${version}-${apps_name}",
creates => "/usr/local/apps/path/apps-version-${version}",
require => [ Package["unzip"], Exec["container_wget"], Exec["apps_wget_${apps_name}] ];
}
Outra alternativa é simplesmente usar um recurso de marionete recursivo como:
file {
"/usr/local/apps/path/":
source => "puppet:///modules/modulename/apps/path",
ensure => directory,
replace => true,
purge => true,
recurse => true;
}
(onde você já descompactou as coisas corretamente no mestre de marionetes. Provavelmente também requer que o pacote esteja executando o serviço e notifique o serviço que está ficando sem funcionar).