我是 Puppet Labs 的 Puppet 的全职开发人员。我也是 Pro Puppet 的合著者。
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
如果您使用的是 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 中可见。但是,当然可以使用外部节点分类器 API。有关将外部数据拉入 Puppet 的更多信息,请参阅以下资源:
希望这些信息有所帮助。