我的应用程序的多个安装 - 我该如何处理它

phi*_*dah 6 deployment automation puppet chef-infra

我有一个用PHP,MySQL等编写的应用程序.该应用程序有一些依赖项,如beanstalkd,Solr和一些PHP扩展.

对于每个客户,我们都可以在与其他客户共享的服务器上或仅与该客户共享的服务器上单独安装该应用程序.

现在我们正在使用Puppet脚本来引导新客户,然后我们手动去每个客户进行git pull,更新数据库等等,只要有变化.

我们正在寻找的是一个具有尽可能多的以下功能的工具:

  1. Web界面,允许我们查看所有客户及其当前版本
  2. 能够引导新安装
  3. 能够将现有安装更新为特定版本或分支

我们不是在寻找引导新服务器的工具 - 我们仍然手动执行此操作.相反,我们正在寻找一种在现有服务器上自动设置客户端的方法.

Chef或Puppet是否足以满足这一需求,是否有更合适的工具,或者您是否建议自己滚动?

Jef*_*une 10

我是Puppet Labs Puppet的全职开发人员.我也是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'],
  }
}
Run Code Online (Sandbox Code Playgroud)

既然您已经在类中拥有了依赖项,那么您只需将此类包含在将部署应用程序的节点上.site.pp如果您正在使用Web界面,这通常发生在文件或Puppet Dashboard中.

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

接下来,您需要一种在系统上声明应用程序的多个实例的方法.遗憾的是,现在没有一种简单的方法可以从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,
  }
}
Run Code Online (Sandbox Code Playgroud)

使用此定义的资源类型,您可以声明应用程序的多个安装,如下所示:

# $(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' }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,目前还没有一种易于使用的方法可以从Web GUI中看到这些信息.但是,使用外部节点分类器API当然可以做到.有关将外部数据提取到Puppet的更多信息,请参阅以下资源:

希望这些信息有所帮助