部署工具和脚本到生产环境的最佳实践?

18

我有一些批处理程序在Linux/PHP网站的后台运行。它们的数量和复杂性正在增长,因此我想对它们进行一些处理。

我的源代码树有许多cpp文件和脚本,是以开发为重点而非部署为重点组织的。在编译所有可执行文件之后,我需要将各种脚本和二进制文件放在一组机器上。不同的机器需要不同的可执行文件、脚本和配置文件来运行它们的批处理程序。我还有一些工具是我编写的,应该放在每台机器上。目前,这个部署过程是手动的,容易出错。

我猜最终会得到一个脚本,在源代码树的根目录下运行,并构建一个包含任何机器所需的所有内容的较小树。然后,我只需将其同步到适当的机器上。但我很好奇其他人是如何管理这种问题的。有什么想法吗?


1
哇,七年过去了...现在有很多工具专门用于应用程序发布自动化。这是一个很好的起点资源,可以了解更多信息:https://en.wikipedia.org/wiki/Application_release_automation - Karl Harnagy
6个回答

19

这里有几个工具类别。一些人使用来自这些类别的组合工具。例如,我有时同时使用Puppet 和Capistrano。请参见 Puppet or Capistrano - Use the Right Tool for the Job 进行讨论。

旨在部署应用程序的脚本工具:

这个类别中的工具通常采用相似于Makefile的命令集创建脚本和 / 或配置文件,并使用SSH到您的生产服务器,执行必要的其他步骤,通常包括检出源代码。

该领域的工具通常具有回滚到以前版本的功能。因此,如果一切顺利,它们将把您的源代码检出到 releases/ 目录,并从 "current" 创建指向 "releases/" 的符号链接。如果有问题,您可以通过运行一个命令将 "current" 删除并将其链接到之前的 releases/ 目录来恢复到上一个版本。

  • Capistrano 来自 Rails 社区,但是是通用目的的。Capistrano 用户可能会对 deprec 感兴趣,在这里是 Capistrano 的一组部署脚本。
  • Vlad the Deployer 是来自 Rails 社区的 Capistrano 替代品。
  • 编写您自己的 shell 脚本或 Makefile。

将文件发送到生产服务器的选项:

  • 直接从源代码检出。如果您的生产服务器缺少开发工具,特别是源代码管理工具,则不总是可行。
  • 在本地检出源代码,然后将其打包成tar / zip文件。使用 scp 或 rsync 将 tarball 复制到服务器上。这有时是首选方法,例如 Amazon EC2 部署中,压缩的 tarball 可以节省时间/带宽。
  • 在本地检出源代码,然后将其rsync到生产服务器上。
  • 打包工具

    使用您的操作系统的打包系统生成包含应用程序文件的软件包。创建一个主软件包,并将其他所需软件包作为依赖项。例如,RubyWorks 系统用于部署 Rails 堆栈和示例应用程序。然后,只需要使用 apt、yum/rpm、Windows msi 或其他软件包管理器部署指定版本。回滚涉及卸载并重新安装旧版本。

    旨在安装应用程序/配置和维护一组系统的通用工具

    这些工具并不是针对部署 Web 应用程序问题的特殊解决方案,而是针对部署/维护一组服务器或整个公司工作站的应用程序/配置的更一般性问题。它们更针对系统管理员,而不是 Web 开发人员,尽管任何人都可能会发现它们有用。

    • Cfengine 是此类工具中的一种。
    • Puppet 旨在改进 Cfengine。它有一定的学习曲线,但许多人发现花时间弄清如何配置是值得的。一旦启用,每个计算机都会定期检查中央服务器,确保一切都是最新的。如果有人编辑文件或更改权限,这将被检测到并进行纠正。因此,与上面的部署工具不同,Puppet 不仅可以为您放置文件在正确的位置,还可以确保它们保持在那里。
    • Chef 是比 Puppet 年轻一些的工具,采用类似的方法。
    • Smartfrog 是此类工具中的另一种。
    • Ansible 使用普通的YAML文件,并且不需要在被管理的服务器上运行代理

    如果您想要比较这些工具以及更多类似的工具,请查看维基百科文章:Comparison of open source configuration management software


    1
    很棒的答案,信息量大且写得很好。只是需要注意:多年过去了,现在 Puppet 也支持 Windows。 - Luke404

    3

    请查看cfengine教程,以确定cfengine是否适合您的情况。对于小型网站来说,它可能有点复杂,但如果将来涉及更多的计算机和更多的配置,那么在某个时候,您将使用cfengine或类似工具。


    2

    按照你的发行版格式创建自己的软件包,例如Debian软件包(.deb)。这些软件包可以手动复制到每台机器上安装,或者您可以设置自己的仓库并将其添加到源列表中。

    您的软件包应设置为包含脚本的配置文件,不同的主机上需要运行哪些脚本取决于不同的配置文件。

    为了将所有内容绑定在一起,您可以创建一个元软件包,它仅依赖于您创建的其他每个软件包。这样,当您设置新服务器时,只需安装该元软件包,其他软件包将作为依赖项引入。

    虽然这个过程听起来有点复杂,但如果您有许多脚本和许多主机需要部署,长期来看它真的会很值得。


    1

    我必须经常向几个客户推出PHP脚本和Apache配置。由于他们都运行Debian Linux,我已在我的服务器上设置了Debian软件包存储库,所有客户只需键入apt-get upgrade,即可获得最新版本。


    1

    首先要做的是将所有这些脚本放入源代码控制存储库(svn或git都可以),以便您可以随时跟踪这些脚本的更改。

    如果您对Ruby感兴趣,请查看Capistrano,它非常适合在集群中部署多台机器,并且设置相当容易。它可以直接从您的版本控制系统读取文件。


    1

    Puppet 是另一个可以在这种情况下使用的工具。它类似于 cfengine - 您创建所需部署的模型,Puppet 确定如何将环境设置为此状态。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接