Como implantar aplicativos (em .tar.gz) com o Puppet?

10

Sou iniciante no Puppet e gostaria de saber se estou no caminho certo para implantar aplicativos com o Puppet.

As aplicações estão em um arquivo tar.gz que contém um arquivo com o número da versão. Então, eu faço isso para implantar (eu vou no servidor e faço um cliente reiniciar para pegar o novo tarball):

nodes.pp

node 'server1.domain.com' inherits basenode {
    apps { apps:
            version => 56,
            apps_name => "apps_tarball.tgz",
    }


init.pp (modules)

exec {"apps_wget":
            command => "/usr/bin/wget http://web_server/${version}-${apps_name} -O /tmp/${container_zip_name}",
            unless  => "test -f /tmp/${version}-${apps_name}",
            require => [ Package["wget"] ],
    }

exec {"apps_unzip":
            cwd     => "/usr/local/apps/path",
            command => "/usr/bin/unzip /tmp/${version}-${apps_name}",
            unless  => "test -f /usr/local/apps/path/apps-version-${version}",
            require => [ Package["unzip"], Exec["container_wget"] ],
    }

Mas, quando quero atualizar, não sei dizer Puppet para excluir o diretório antigo? Por exemplo, se eu quiser atualizar a versão 56 para 57: devo excluir o diretório de versão do 56.

Eu ouvi sobre o Capristrano e parece ser melhor usar o Puppet para pacotes de managinig, arquivos de configuração e usar o Capristrano para implantar aplicativos, não é?

Obrigado.

    
por Richy 01.08.2011 / 15:53

5 respostas

0

I would like to know if I'm on the right way to deploy applications with Puppet.

Não, você não é.

Você deve usar o gerenciamento de pacotes disponível em seu sistema operacional. Se o seu software estiver em tar.gz format, você deverá re-empacotá-lo localmente como .deb , .rpm ou qualquer outra coisa.

Se o software é algo desenvolvido localmente, você deve usar as ferramentas de compilação / implantação disponíveis para ele.

    
por 01.08.2011 / 19:23
13

Você pode tentar usar fpm para fazer RPMs ou DEBs de seus tarballs; é muito simples de usar e você não precisa entender nada sobre os formatos de pacote que não deseja.

Para responder à sua pergunta original, a maneira correta de implantar aplicativos com o Puppet é fazer com que o Puppet faça o mínimo possível de trabalho; qualquer recurso exec complicado que baixe e extraia tarballs será muito, muito frágil, e fazendo do Puppet apenas yum install um pacote é muito mais saudável a longo prazo.

    
por 15.10.2011 / 10:42
6

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).

    
por 01.08.2011 / 20:45
0
file { "/usr/local/apps/path/apps-version-${old-version}":
    ensure => absent
}

Como um aparte, fazer tudo como executivos é meio feio e pode ser difícil solucionar problemas quando as coisas começam a quebrar; se puder, talvez mantenha versões extraídas dos arquivos do aplicativo no servidor de fantoches e use um recurso file recursivo para recuperar?

    
por 01.08.2011 / 17:35
0

Eu certamente prefiro empacotar o tarball (RPM ou qualquer outra coisa), mas algumas dicas:

Para excluir a versão antiga, você pode simplesmente excluir todas as versões, exceto aquela que está instalando. Com um recente bash e extglob habilitado você pode rm -r /usr/local/apps/path/apps-version-!(${version}) . Cuidado com a limpeza de arquivos de configuração e tal. Você pode fazer o exec refreshonly => true e, em seguida, notify do exec de instalação.

Você pode usar o atributo creates em vez de unless => 'test -f ...' . Um, mas mais compreensível.

    
por 17.02.2015 / 00:18