Come distribuire applicazioni (in .tar.gz) con Puppet?


11

Sono un principiante con Puppet e vorrei sapere se sono sulla strada giusta per distribuire applicazioni con Puppet.

Le applciazioni sono in un file tar.gz che contiene un file con il numero di versione. Quindi, faccio questo per distribuire (vado sul server e faccio un riavvio del client per raccogliere il nuovo 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"] ],
    }

Ma, quando voglio aggiornare, non so dire Puppet per cancellare la vecchia directory? Ad esempio, se voglio aggiornare la versione da 56 a 57: devo eliminare la directory della versione da 56.

Ho sentito parlare di Capristrano e sembra che sia meglio usare Puppet per gestire pacchetti, configurare file e usare Capristrano per distribuire app, non è vero?

Grazie.


Uso il modulo forge.puppetlabs.com per gestire il download / decompressione / posizionamento di oggetti che sono disponibili solo come tarball. Funziona benissimo.
jrjohnson,

Risposte:


0

Vorrei sapere se sono sulla strada giusta per distribuire applicazioni con Puppet.

No tu non sei.

È necessario utilizzare la gestione dei pacchetti disponibile sul proprio sistema operativo. Se il software è in tar.gzformato, si dovrebbe ri-pacchetto IT localmente .deb, .rpmo qualsiasi altra cosa.

Se il software è sviluppato localmente, è necessario utilizzare qualsiasi strumento di compilazione / distribuzione disponibile per esso.


10
In un mondo perfetto, gli amministratori impiegheranno del tempo per creare pacchetti da tarball. Nel mondo reale, la mia esperienza ha dimostrato che ciò non accade. I nostri clienti installano molte applicazioni, a volte applicazioni molto grandi, da tarball e non hanno intenzione di cambiarlo.
EmmEff

4
@EmmEff Questa non è una differenza tra il mondo perfetto e il mondo reale. Questa è una differenza tra "Siamo bloccati ai vecchi modi e non siamo pronti per la gestione automatica della configurazione" luoghi e luoghi in cui la gestione della configurazione funziona. Ho visto entrambi - e persino visto il secondo trasformarsi nel primo con un cambio di amministratori.
Daniel C. Sobral,

5
Hai il diritto alla tua opinione. Le mie osservazioni nel mondo reale sono diverse da quelle.
EmmEff,

13

Potresti provare a usare fpm per creare RPM o DEB dei tuoi tarball; è davvero semplice da usare e non devi capire nulla dei formati di pacchetto che non vuoi.

Per rispondere alla tua domanda originale, il modo giusto di distribuire le applicazioni con Puppet è fare in modo che Puppet esegua il minor lavoro possibile; qualsiasi execrisorsa complicata che scarica ed estrae tarball è destinata a essere molto, molto fragile, e rendere Puppet solo yum installun pacchetto è molto più sano a lungo termine.


Sapevo che quello che stavo facendo era molto sbagliato. Ma la costruzione dei giri mi ha sempre spaventato. fpm è la mia salvezza. Grazie tuttofare5. f-sì.
Nessuno 1

ottimo commento. Invece di predicare "usa rpm" hai fornito un semplice "usa un falso rpm e usa questo semplice strumento per realizzarlo".
Andre de Miranda,

6

Farei del mio meglio per raggruppare l'app come pacchetto RPM o .deb e creare un repository yum o apt per contenere i pacchetti. Il confezionamento di un tarball o zip che stai appena aprendo in una directory è piuttosto semplice (ma dovrebbe essere una domanda separata). Il packaging disponibile in questo modo tiene traccia delle versioni e gestisce ogni sorta di cose che l'apertura di un tarball non gestirà bene.

Se davvero non riuscissi a costruire un pacchetto adeguato farei qualcosa del genere:

nodes.pp:

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

init.pp (moduli):

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}] ];
}

Un'altra alternativa è semplicemente utilizzare una risorsa fantoccio ricorsiva come:

file {
    "/usr/local/apps/path/":
      source => "puppet:///modules/modulename/apps/path",
      ensure => directory,
      replace => true,
      purge   => true,
      recurse => true;
}

(dove hai già decompresso correttamente le cose sul burattinaio. Probabilmente richiedono anche qualunque pacchetto stia eseguendo il servizio e avvisare qualunque servizio stia finendo).


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

Per inciso, fare tutto come un dirigente è un po 'brutto e può essere difficile risolvere i problemi quando le cose iniziano a rompersi; se è possibile, forse mantenere le versioni estratte dei file dell'app sul server delle marionette e utilizzare una filerisorsa ricorsiva per recuperare?


0

Preferisco di certo confezionare il tarball (RPM o altro), ma alcuni suggerimenti:

Per eliminare la versione precedente puoi semplicemente eliminare tutte le versioni tranne quella che stai installando. Con un bash abbastanza recente ed extglob abilitato puoi farlo rm -r /usr/local/apps/path/apps-version-!(${version}). Fai attenzione a cancellare i file di configurazione e così via. È possibile creare il exec refreshonly => truee quindi notifydal programma di installazione exec.

È possibile utilizzare l' createsattributo anziché unless => 'test -f ...'. Un ma più comprensibile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.