gpt4 book ai didi

deployment - 我的应用程序多次安装 - 我该如何处理

转载 作者:行者123 更新时间:2023-12-04 14:04:38 25 4
gpt4 key购买 nike

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

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

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

我们正在寻找的实际上是一种工具,它具有尽可能多的以下功能:

  • 允许我们查看所有客户及其当前版本的 Web 界面
  • 能够引导新安装
  • 能够将现有安装更新到特定修订版或分支

  • 我们不是在寻找引导新服务器的工具——我们仍然手动进行。相反,我们正在寻找一种在现有服务器上自动设置客户端的方法。

    Chef 或 Puppet 是否足以满足此要求,是否有更合适的工具,或者您会建议自己滚动一些东西吗?

    最佳答案

    我是 Puppet Labs 的 Puppet 全职开发人员。我也是 Pro Puppet 的合著者。

    Puppet 肯定足以满足您的目标。这是使用 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'],
    }
    }

    现在您在一个类中拥有您的依赖项,您可以简单地在将部署您的应用程序的节点上包含这个类。这通常发生在 site.pp文件或 Puppet 仪表板(如果您使用的是 Web 界面)。
    # $(puppet config print confdir)/manifests/site.pp
    node www01 {
    include site::app_dependencies
    }

    接下来,您需要一种在系统上声明应用程序的多个实例的方法。不幸的是,目前没有一种简单的方法可以从 Web 界面执行此操作,但可以使用 Puppet list 和定义的资源类型。此解决方案使用 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 的更多信息,请参阅以下资源:
  • External Nodes Documentation
  • R.I. Pienaar's Hiera (Hierarchical data store)

  • 希望这些信息有帮助。

    关于deployment - 我的应用程序多次安装 - 我该如何处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8794502/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com