当前位置: 首页 > 科技观察

基础设施即代码解读

时间:2023-03-16 00:25:32 科技观察

现代软件开发对基础设施管理提出了更加严苛的要求:产品必须适应瞬息万变的市场,要求基础设施有更快的响应速度。持续交付和DevOps的实施,需要产品团队在部署和运维上有更高的自主权。技术的快速进步和演进也使得基础设施的配置不得不频繁变化。在这个瞬息万变的过程中,要求基础设施既要灵活,又要安全可靠。传统的基础设施运维管理存在以下问题:被动响应。产品团队采用申请系统获取服务器资源,中间有多个审批流程,需要等待运维团队实施,响应不及时。自动化缺乏串联。虽然有一定程度的自动化,但不能无人值守,需要执行一些临时命令进行干预。由于环境发布和重建成本高,有不发布的倾向,导致资源利用率低。与产品团队脱节。很难根据需求随时动态增加环境。需要其他文档来描述环境,并且可能不是最新的。在实施持续交付的过程中,产品团队必须考虑将基础设施的维护作为支持产品运行的一部分。下面是一个产品团队的持续交付管道的全景图。从上图可以看出,产品组不仅管理项目本身的代码,还管理环境定义脚本。环境定义脚本可以通过基础设施自动化工具执行,动态创建、销毁和更新产品运行所需的环境(包括服务器、负载均衡器、防火墙配置、第三方依赖等)。如果做到这一点,基础设施即代码的原型就实现了。Kief在他的本书《Infarftruce As Code》中对基础设施即代码的定义如下:以结构化和安全的方式管理系统变更的软件工程实践。”基础设施即代码有四个关键原则:可重复性。环境中的任何元素都可以轻松复制。一致性。所创建环境的每个元素的配置在任何时候都是相同的。快速反馈。能够频繁、轻松、快速地了解更改是否正确。能见度。对环境的所有更改都应该易于理解、可审计和版本控制。基础架构即代码的目标是:标准化。环境由代码定义,实现了开发环境、测试环境、生产环境的标准化。自动化。使用自动化工具驱动代码准备环境。包括创建环境、更新环境和销毁环境。可视化。通过监控可视化环境信息。环境现状可见,环境变化历史可见可追溯。基础设施即代码实践使持续交付和DevOps高度成熟。在实现基础设施即代码时,必须遵循以下做法:1.使用DSL描述环境基础设施自动化工具,如Ansible、Chef、SaltStack、Terraform,都有自己的描述语言来实现基础设施的定义。使用DSL可以更轻松地以描述性语言定义基础设施,还可以促进代码重用。团队成员可以建立共识来维护脚本。下面是Ansible的示例剧本。----hosts:localtasks:-name:InstallNginxapt:pkg=nginxstate=installedupdate_cache=truenotify:-StartNginxhandlers:-name:StartNginxservice:name=nginxstate=started环境测试。确保所有服务器都正确配置,遵守所有安全规则,验证网络连接等。我们通常提倡将测试代码和配置代码一起维护。这样在更新配置代码的时候,可以保证测试代码也及时更新。一些典型的基础设施自动化测试工具有ServerSpec、Testinfra等,下面是一个ServerSpec的例子。require'spec_helper'describepackage('httpd'),:if=>os[:family]=='redhat'doit{shouldbe_installed}enddescribepackage('apache2'),:if=>os[:family]=='ubuntu'doit{shouldbe_installed}enddescribeservice('httpd'),:if=>os[:family]=='redhat'doit{shouldbe_enabled}it{shouldbe_running}enddescribeservice('apache2'),:if=>os[:family]=='ubuntu'doit{shouldbe_enabled}it{shouldbe_running}enddescribeservice('org.apache.httpd'),:if=>os[:family]=='darwin'doit{shouldbe_enabled}it{shouldbe_running}enddescribeport(80)doit{shouldbe_listening}结束3。一切都是版本化一旦采用环境定义脚本来控制环境,就需要将环境定义脚本纳入版本管理。而后续所有的环境变更,首先要修改环境定义脚本,环境定义脚本触发对环境的变更。严禁登录服务器执行一些临时命令。因为它极有可能破坏环境的一致性。重建服务器时,不能保证应用所有必需的更改。下图是基础设施即代码的典型使用场景。此外,如果要在生产环境中创建可扩展的服务,还需要借助“基础架构即代码”的实践。在高峰期,系统可以根据定义的环境自动创建和添加新节点,实现动态扩容,在低峰期销毁。当监控发现某个节点发生故障时,系统可以根据定义的环境自动创建新的节点来替代发生故障的节点,实现自动容灾。***是我们在某团队实现基础设施即代码的案例分析。这张图是一个团队的基础架构图。该团队使用AWS作为基础设施平台。我们选择ansible作为基础设施自动化工具,结合AWS提供的cloudformation服务,快速创建和销毁资源。所有网元都有明确的角色划分和相应的配置脚本。从网络配置到网元配置、应用配置实现全自动化。所有配置脚本连同源代码都托管在GitHub上。所有团队成员都可以查看和修改。【本文为专栏作家《ThoughtWorks》原创稿件,微信公众号:Thinkworker,转载请联系原作者】点此查看该作者更多好文