服务器配置自动化:Windows Azure 上的 Ubuntu(+ WordPress、Nginx、Git)

服务器配置自动化:Windows Azure 上的 Ubuntu(+ WordPress、Nginx、Git)

我们希望获得一些关于如何自动将 Ubuntu 虚拟机配置为我们应用程序的暂存服务器的想法,测试暂存代码,然后将脚本部署到生产服务器(而不是由一个人通过 ssh 在暂存服务器上安装所有内容,复制文件,手动编辑配置等)

如果需要的话,我们可以迁移到 AWS,但目前使用 Azure 也还好——我们基本上在 Azure 上获得了一个具有 SSH 访问权限的 Ubuntu VM,因此我认为它与其他配置基于 Linux 的服务器的方式应该没什么不同

我们希望脚本能做的事情基本上是:

  • 通过 SSH 进入新的虚拟机
  • 设置 nginx、MariaDB、php 和其他 apt-get 安装
  • 从 Git 存储库部署我们的 wordpress 代码副本
  • 将示例暂存数据库以及 wordpress 配置信息和其他信息导入 MariaDB
  • 使用 cloudflare API 为服务器设置 DNS 主机名(可选,如果需要可以手动执行)
  • 让测试新代码的人四处探索

如果一切正常,我们希望自动将 Git 中的新代码推送到我们的生产服务器,而无需手动编辑 wordpress 配置文件等。但这与通过脚本设置暂存环境的问题有点不同

我目前遇到的工具是这些(由于帐户声誉低,无法提供链接)

  • 厨师
  • 木偶
  • 流浪汉
  • 盐栈
  • Ansible
  • 朱朱

在深入研究它们之前,我想知道是否有人能从万米高空俯瞰什么才适合我们的需求。

答案1

您真正寻找的是针对两个不同但紧密相关且相互叠加的问题的解决方案:

  1. 配置管理
  2. 部署自动化

两者之间有一些重叠,当你刚开始时,你可能会有点不清楚应该使用哪种工具来处理基础设施的哪些部分。不过,这里有一些通用的指导原则可以帮助你入门:

配置管理工具通常遵循资源导向幂等模型。也就是说,你将系统建模为一组具有状态的资源,然后运行配置管理工具持续地查看是否有任何内容与您的规范不同。如果资源不处于该状态,则可以使用某些类型特定的逻辑将资源置于该状态。包或用户帐户是一种简单而明显的资源,但您可能还拥有 ElasticSearch 模板、SELinux 数据库中的条目或 Nagios 主机,它们也可以在您选择的配置管理系统中声明为资源。

举一个简单的例子,一个包可能是已安装或者未安装,并且可能附加了版本。配置管理工具将能够获取配置规范,该规范说明应该安装软件包 X,查看它当前尚未安装,并采取正确的步骤将其从未安装已安装状态(显然,通过安装它)。

幂等性意味着您可以应用相同的配置十次、一百次或一千次,并获得完全相同的结果 - 只有需要更改的内容才会真正改变。这与脚本形成对比,脚本可能会将一行追加到配置文件一百次(意味着您最终会在该文件中看到同一行一百次)。

使用此模型的配置管理系统的缺点是,资源之间的关联相当松散,它们不能很好地映射到长期运行的任务(如数据库导入或模式迁移),并且它们通常不能让您对堆栈中跨多个系统应用事物的确切顺序进行大量控制。

Puppet 和 Chef 是配置管理系统的例子。

部署自动化工具用于执行特别指定任务。换句话说,当您需要执行某项操作时,您便会明确运行它们。(好的,有时您可以从触发器隐式地运行它们,例如从持续集成系统。)这些通常以可预测的方式协调多个系统;例如,您可能只希望您的一个 Web 服务器在升级期间运行数据库迁移,您可能希望仅在数据库迁移成功时才执行应用服务器升​​级,并且您可能希望您的应用服务器一次重新启动三个,这样您就不会在更新期间关闭整个应用程序。最重要的是,您只希望此过程启动当你告诉它

Capistrano 和 Fabric 是部署自动化工具的流行示例。对于单个服务器,您可以轻松地在整个应用程序中使用 Makefile 之类的东西。

在您的特定情况下,您可能希望配置管理系统处理诸如数据库系统和 PHP 的安装以及 Web 服务器的配置等事务。另一方面,您可能希望部署工具处理数据库的创建以及将测试数据填充到其中。从 Git 下载应用代码的过程可以很容易地通过配置管理或部署自动化工具进行建模,具体取决于哪种方法更适合您的需求。无论您选择哪种方法,人们对如何实现部署自动化都有不同的看法。配置文件您的应用程序应该可以进入服务器。

使用这些工具时,最重要的是,如果使用不当,它们就完全是浪费。换句话说,如果您使用花哨的自动部署方法将应用程序置于暂存状态,而生产服务器实际上看起来并不完全像您花哨的暂存服务器,那么您就浪费了大量精力却几乎没有任何收获。正确使用它们,它们会为您带来很好的服务。

答案2

我更喜欢 RH(我会使用 kickstart 来完成基本操作 + 使用 puppet 来完成其余操作),但无论如何,尝试一下 puppet。它应该很容易上手,因为不久前 Wikimedia 发布了 GIT 及其所有 puppet 配置文件:

http://blog.wikimedia.org/2011/09/19/ever-wondered-how-the-wikimedia-servers-are-configured/

答案3

我知道这个答案可能听起来很奇怪...但考虑使用Hudson,你可以让它做任何你想做的事情,只需通过一些调整...并编写脚本..

答案4

我会用Ansible- 与 Chef、Puppet 或 Saltstack 相比,Ansible 的入门要简单得多,它们的功能类似,但学习曲线要​​陡峭得多(由于需要服务器,安装 Puppet 需要很长时间,而 Ansible 只需一个安装命令,不需要服务器。

Ansible 可以很好地配置在 Azure 上运行的 Linux VM,如果您愿意,还可以创建 Azure 资源,例如 VM、网络接口和网络安全组。如果您更喜欢使用 Azure CLI,则可以使用模块将 CLI 命令嵌入 Ansible,shell只要它们是幂等的(即使再次运行也具有相同的效果)。

看看 Ansible角色(可重复使用的第三方脚本模块)适用于您的组件 - 有适用于 WordPress、MariaDB/MySQL 和 CloudFlare 的角色。尝试杰夫·吉尔林的角色首先,如果它们能满足您的需要,它们往往会发挥很好的作用。

然后,您可以在这些角色之上编写一些特定的代码来完成您想要的操作。

Ansible 还可以很好地用于部署自动化,以取代 Fabric Capistrano(如果您喜欢 Capistrano 模型,请搜索 Ansistrano)。

相关内容