私は Puppet Labs で Puppet に取り組んでいるフルタイムの開発者です。Pro Puppet の共著者でもあります。
パペットは確かにあなたの目標に十分です. Puppet を使用してこの問題を解決する 1 つの方法を次に示します。まず、依存関係の管理について説明します。これは、アプリケーションのインスタンスがいくつ管理されているかに関係なく、依存関係の管理は 1 回だけ行う必要があるためです。次に、Puppet で定義されたリソース タイプとリソース タイプを使用して、アプリの複数のインストールを処理する方法について説明しますvcsrepo
。
まず、同じアプリの複数のインストールを処理するためのパペット コードの編成についてです。あなたが言及したbeanstalkd、solr、PHP拡張機能などの依存関係は、Puppetクラスを使用してモデル化する必要があります。このクラスは、ノードで管理されているアプリケーションのコピーの数に関係なく、構成カタログに 1 回だけ含まれます。このクラスの例は次のようになります。
# <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
ファイルまたは Web インターフェイスを使用している場合は Puppet ダッシュボードで発生します。
# $(puppet config print confdir)/manifests/site.pp
node www01 {
include site::app_dependencies
}
次に、システム上でアプリケーションの複数のインスタンスを宣言する方法が必要です。残念ながら、現時点では Web インターフェースからこれを行う簡単な方法はありませんが、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' }
}
残念ながら、Web GUI からこの情報を表示できるようにするための、すぐに使用できる簡単な方法は現在のところありません。ただし、External Node Classifier API を使用することは確かに可能です。外部データを Puppet に取り込む方法の詳細については、次のリソースを参照してください。
この情報がお役に立てば幸いです。