Deployment 我的应用程序的多个安装-如何处理
我有一个用PHP、MySQL等编写的应用程序。该应用程序有一些依赖项,如beanstalkd、Solr和一些PHP扩展 对于每个客户,我们都有一个单独的应用程序安装,可以安装在与其他客户共享的服务器上,也可以安装在仅与该客户共享的服务器上 现在,我们使用一个Puppet脚本来引导新客户,然后我们手动到每个客户进行git拉取,更新数据库,等等,只要有什么变化 我们正在寻找的是一种真正具有以下功能的工具:Deployment 我的应用程序的多个安装-如何处理,deployment,automation,chef-infra,puppet,Deployment,Automation,Chef Infra,Puppet,我有一个用PHP、MySQL等编写的应用程序。该应用程序有一些依赖项,如beanstalkd、Solr和一些PHP扩展 对于每个客户,我们都有一个单独的应用程序安装,可以安装在与其他客户共享的服务器上,也可以安装在仅与该客户共享的服务器上 现在,我们使用一个Puppet脚本来引导新客户,然后我们手动到每个客户进行git拉取,更新数据库,等等,只要有什么变化 我们正在寻找的是一种真正具有以下功能的工具: 允许我们查看所有客户及其当前版本的Web界面 能够引导新安装 能够将现有安装更新到特定版本或分
厨师或木偶就足够了吗,有没有更合适的工具,或者你会推荐自己做些什么?我是木偶实验室木偶的全职开发人员。我也是《亲木偶》的合著者 木偶当然足以实现你的目标。这里有一种使用Puppet解决此问题的方法。首先,我将讨论依赖关系管理,因为无论管理多少个应用程序实例,这些依赖关系都只应管理一次。然后,我将介绍如何使用Puppet中定义的资源类型和
vcsrepo
资源类型处理应用程序的多个安装
首先,关于puppet代码的组织,以处理同一应用程序的多个安装。您提到的依赖项(如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'],
}
}
接下来,您需要一种方法来声明系统上应用程序的多个实例。不幸的是,现在还没有一种简单的方法可以从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,
}
}
不幸的是,目前还没有一种易于使用的开箱即用的方法使这些信息从web GUI可见。但是,使用外部节点分类器API当然可以做到这一点。有关将外部数据拉入Puppet的更多信息,请参阅以下参考资料:
希望这些信息能有所帮助。我正在尝试做一些非常类似的事情,使用factory模式界面,但我在处理跨实例共享的目录时遇到了一个难题,你能检查我的问题吗@
# <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' }
}