2012-01-09 13 views
6

Ho un'app scritta in PHP, MySQL, ecc. L'app ha alcune dipendenze come beanstalkd, Solr e alcune estensioni PHP.Più installazioni della mia app - come gestirla

Per ogni cliente abbiamo un'installazione separata dell'app, su un server condiviso con altri clienti o su un server con solo quel cliente.

Per ora usiamo uno script Puppet per avviare nuovi clienti e poi andiamo manualmente a ciascun cliente per fare un tiro di git, aggiornare il db, ecc. Ogni volta che qualcosa cambia.

Quello che stiamo cercando è davvero uno strumento che ha come molte delle seguenti caratteristiche il più possibile:

  1. un'interfaccia Web che ci permette di vedere tutti i clienti e la loro revisione corrente
  2. Capacità di bootstrap nuove installazioni
  3. capacità di aggiornare le installazioni esistenti per una revisione specifica o ramo

non stiamo cercando uno strumento per l'avvio di nuovi server - abbiamo ancora fallo manualmente. Invece stiamo cercando un modo per automatizzare l'installazione dei client su un server esistente.

Lo chef o il burattino sarebbe sufficiente per questo, c'è uno strumento più adatto o consiglieresti a qualcuno di arrotolare qualcosa?

risposta

10

Sono uno sviluppatore a tempo pieno che lavora su Puppet at Puppet Labs. Sono anche il coautore di Pro Puppet.

Puppet è sicuramente sufficiente per i tuoi obiettivi. Ecco un modo per risolvere questo problema usando Puppet. Innanzitutto, affronterò la gestione delle dipendenze poiché queste dovrebbero essere gestite solo una volta, indipendentemente dal numero di istanze dell'applicazione gestite. Quindi, descriverò come gestire più installazioni della tua app utilizzando un tipo di risorsa definito in Puppet e il tipo di risorsa vcsrepo.

In primo luogo, per quanto riguarda l'organizzazione del codice puppet per gestire più installazioni della stessa app. Le dipendenze menzionate come beanstalkd, solr e le estensioni PHP dovrebbero essere modellate usando una classe Puppet. Questa classe verrà inclusa nel catalogo di configurazione solo una volta, indipendentemente dal numero di copie dell'applicazione gestite sul nodo. Un esempio di questa classe potrebbe essere qualcosa di simile:

# <modulepath>/site/manifests/app_dependencies.pp 
class site::app_dependencies { 
    # Make all package resources in this class default to 
    # being managed as installed on the node 
    Package { ensure => installed } 
    # Now manage the dependencies 
    package { 'php': } 
    package { 'solr': } 
    package { 'beanstalk': } 
    # The beanstalk worker queue service needs to be running 
    service { 'beanstalkd': 
    ensure => running, 
    require => Package['beanstalk'], 
    } 
} 

Ora che avete le dipendenze in una classe, si può semplicemente includere questa classe sui nodi in cui verrà distribuito l'applicazione. Questo di solito accade nel file site.pp o in Puppet Dashboard se stai usando l'interfaccia web.

# $(puppet config print confdir)/manifests/site.pp 
node www01 { 
    include site::app_dependencies 
} 

Successivamente, è necessario un modo per dichiarare più istanze dell'applicazione sul sistema. Sfortunatamente, non esiste un modo semplice per farlo da un'interfaccia web in questo momento, ma è possibile utilizzare i manifesti Puppet e un tipo di risorsa definito. Questa soluzione utilizza la risorsa vcsrepo per gestire il checkout del repository git per l'applicazione.

# <modulepath>/myapp/manifests/instance.pp 
define myapp::instance($git_rev='master') { 
    # Resource defaults. The owner and group might be the web 
    # service account instead of the root account. 
    File { 
    owner => 0, 
    group => 0, 
    mode => 0644, 
    } 
    # Create a directory for the app. The resource title will be copied 
    # into the $name variable when this resource is declared in Puppet 
    file { "/var/lib/myapp/${name}": 
    ensure => directory 
    } 
    # Check out the GIT repository at a specific version 
    vcsrepo { "/var/lib/myapp/${name}/working_copy": 
    ensure => present, 
    provider => git, 
    source => 'git://github.com/puppetlabs/facter.git', 
    revision => $git_rev, 
    } 
} 

Con questo definito tipo di risorsa, è possibile dichiarare più installazioni di vostra applicazione in questo modo:

# $(puppet config print confdir)/manifests/site.pp 
node www01 { 
    include site::app_dependencies 
    # Our app instances always need their dependencies to be managed first. 
    Myapp::Instance { require => Class['site::app_dependencies'] } 

    # Multiple instances of the application 
    myapp::instance { 'jeff.acme.com': git_rev => 'tags/1.0.0' } 
    myapp::instance { 'josh.acme.com': git_rev => 'tags/1.0.2' } 
    myapp::instance { 'luke.acme.com': git_rev => 'tags/1.1.0' } 
    myapp::instance { 'teyo.acme.com': git_rev => 'master' } 
} 

Purtroppo, non c'è attualmente un facile da usare fuori del modo di dialogo per rendere queste informazioni visibili da una GUI Web. È certamente possibile, tuttavia, utilizzare l'API del classificatore di nodo esterno. Per ulteriori informazioni su tirando dati esterni in Puppet consultare queste risorse:

Spero che queste informazioni aiuta.

+0

Sto provando a fare qualcosa di molto simile, usando un'interfaccia di modello di fabbrica ma sto avendo una volta in cui devo gestire le directory condivise tra le istanze, puoi controllare la mia domanda @ http://serverfault.com/questions/ 442.520/moduli fantoccio-possibili da usare software-design-patterns-in- –

Problemi correlati