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