Я полный рабочий день, работаю над Puppet в Puppet Labs. Я также соавтор Pro Puppet.
Кукольный, безусловно, достаточно для ваших целей. Вот один из способов решения этой проблемы с помощью Puppet. Во-первых, я расскажу об управлении зависимостями, поскольку им нужно управлять только один раз, независимо от того, сколько экземпляров приложения управляется. Затем я расскажу, как обрабатывать несколько установок вашего приложения, используя определенный тип ресурса в Puppet и тип ресурса vcsrepo
.
Во-первых, относительно организации кода марионетки для обработки нескольких установок одного и того же приложения. Упомянутые вами зависимости, такие как beanstalkd, solr и расширения PHP, должны быть смоделированы с использованием класса Puppet. Этот класс будет включен в каталог конфигурации только один раз, независимо от того, сколько копий приложения управляется на узле. Примером этого класса может быть что-то вроде:
# <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'],
}
}
Теперь, когда у вас есть зависимости в классе, вы можете просто включить этот класс в узлы, где будет развернуто ваше приложение. Обычно это происходит в файле site.pp
или на панели инструментов Puppet, если вы используете веб-интерфейс.
# $(puppet config print confdir)/manifests/site.pp
node www01 {
include site::app_dependencies
}
Далее вам нужен способ объявления нескольких экземпляров приложения в системе. К сожалению, сейчас нет простого способа сделать это из веб-интерфейса, но это возможно, используя манифесты Puppet и определенный тип ресурса. Это решение использует ресурс vcsrepo
для управления извлечением git-репозитория для приложения.
# <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,
}
}
С этим определенным типом ресурса вы можете объявить несколько установок вашего приложения следующим образом:
# $(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' }
}
К сожалению, в настоящее время нет простого в использовании способа сделать эту информацию видимой из веб-интерфейса. Однако это, безусловно, возможно сделать с помощью API Class Node Classifier. Для получения дополнительной информации о добавлении внешних данных в Puppet, пожалуйста, обратитесь к следующим ресурсам:
Надеюсь, эта информация поможет.