解读基础设施即代码

简介: 现代软件开发对基础设施的管理提出了更苛刻的要求。产品要适应瞬息万变的市场,要求基础设施要有更快的响应速度。而持续交付和DevOps的推行要求产品团队对部署和运维要有更高的自主性。技术的快速进步和演化,也使得基础设施的配置不得不频繁变化。

现代软件开发对基础设施的管理提出了更苛刻的要求。产品要适应瞬息万变的市场,要求基础设施要有更快的响应速度。而持续交付和DevOps的推行要求产品团队对部署和运维要有更高的自主性。技术的快速进步和演化,也使得基础设施的配置不得不频繁变化。在这种快速变化的过程中,要求基础设施既要灵活,也要安全、可靠。

而传统的基础设施运维管理具有以下几个问题。

  • 被动响应。 产品团队获取服务器资源采用的是申请制,中间存在若干审批过程,以及需要等待运维团队实施,响应不及时。

  • 自动化缺乏串联。虽然有一定的自动化,但不能做到无人值守,需要执行一些临时命令介入。由于环境释放和重建的成本高,因而倾向于不释放,导致资源利用率低。

  • 和产品团队脱节。很难根据需求随时动态增加环境。需要额外的文档来描述环境,可能更新不及时。

产品团队是实施持续交付的过程中,必须考虑将基础设施的维护纳入进来,作为支持产品运行的一部分。以下是产品团队的持续交付流水线全景图。

img_72479c1bd77bbc0a2aa54a287126f20d.png

从上图可以看出,产品团队除了管理项目本身代码外,还要管理环境定义脚本。环境定义脚本可以由基础设施自动化工具执行,动态创建和销毁和更新产品运行所需的环境(包括服务器、负载均衡器、防火墙配置、第三方依赖等)。

如果实现了这一点,那么就实现了基础设施即代码的雏形。Kief在《Infarftruce As Code》一书中对基础设施即代码定义如下:

基础设施即代码是一种使用新的技术来构建和管理动态基础设施的方式。它把基础设施、工具和服务以及对基础设施的管理本身作为一个软件系统,采纳软件工程实践以结构化的安全的方式来管理对系统的变更。

基础设施即代码有四项关键原则。

  • 再生性。

环境中的任何元素可以轻松复制。

  • 一致性。 无论何时,创建的环境各个元素的配置是完全相同的。

  • 快速反馈。 能够频繁、容易地进行变更,并快速知道变更是否正确。

  • 可见性。 所有对环境的变更应该容易理解,可审计,受版本控制。

基础设施即代码的目标是:

  • 标准化。 以代码来定义环境,实现开发环境、测试环境、生产环境的标准化。

  • 自动化。 以自动化工具来驱动代码准备环境。包括创建环境、更新环境以及销毁环境。

  • 可视化。 以监控来可视化环境信息。环境当前状态可视、环境变更历史可视、可追溯。

基础设施即代码实践会产生高成熟度的持续交付和DevOps。

img_a471b1f8643b3874dced7b4f55f17351.png

在实施基础设施即代码时,要遵守以下实践。

  • 使用DSL描述环境。

Ansible、Chef、SaltStack、Terraform等基础设施自动化工具都有各自的描述性语言实现对基础设施的定义。使用DSL更容易通过描述性的语言定义基础设施,也有助于代码重用。团队成员能建立起共同理解,从而维护脚本。

以下是Ansible的一个playbook示例。

1
2
3
4
5
6
7
8
9
10
11
---
- hosts: local
  tasks:
   - name: Install Nginx
     apt: pkg=nginx state=installed update_cache=true
     notify:
      - Start Nginx

  handlers:
   - name: Start Nginx
     service: name=nginx state=started
  • 自测试系统。

在编写环境代码的配置时,也要编写对环境的测试。确保所有服务器都正确进行了配置,遵守了所有的安全规则,网络连通性等进行了验证。我们一般提倡将测试代码和配置代码放在一起维护。这样配置代码更新的化,能保证测试代码也被及时更新。

一些典型的基础设施自动化测试工具有ServerSpec、Testinfra等。以下是一个ServerSpec的示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

require 'spec_helper'

describe package('httpd'), :if => os[:family] == 'redhat' do
  it { should be_installed }
end

describe package('apache2'), :if => os[:family] == 'ubuntu' do
  it { should be_installed }
end

describe service('httpd'), :if => os[:family] == 'redhat' do
  it { should be_enabled }
  it { should be_running }
end

describe service('apache2'), :if => os[:family] == 'ubuntu' do
  it { should be_enabled }
  it { should be_running }
end

describe service('org.apache.httpd'), :if => os[:family] == 'darwin' do
  it { should be_enabled }
  it { should be_running }
end

describe port(80) do
  it { should be_listening }
end
  • 一切进行版本化。

一旦采用了环境定义脚本实现对环境的控制后,需要将环境定义脚本纳入到版本管理中。并且之后所有的环境变更都应该先修改环境定义脚本,由环境定义脚本触发对环境的变更。登录到服务器执行一些临时性命令是被坚决禁止的。因为这极有可能会破坏环境的一致性。当重建服务器时,也不能保证能应用所有需要的变更。

下图是基础设施即代码的一个典型使用场景。

img_76cda794eafa945c4e7c2447e6d14858.png

除此之外,如果想要在生产环境中创建可伸缩性的服务的话,也需要借助机舱设施即代码这一实践。在高峰时期,系统可以根据定义的环境自动创建并加入新的节点实现动态扩容,并在低峰时将其销毁。当监控发现某节点失败,系统可以根据定义的环境自动创建新的节点来替换失败节点,实现自动灾难恢复。

最后是我们在某团队实施基础设施即代码的案例解析。这张图是某团队的基础设施架构图。

img_53c243ee71c91162c9f1c9e5fd345e85.png

该团队使用AWS作为基础设施平台。我们选用ansible作为基础设施自动化工具,并结合AWS提供的cloudformation服务实现快速创建和销毁资源。所有网元都有清晰的角色划分,配套对应的配置脚本。从网络配置到网元配置以及应用配置都实现了全自动化。所有的配置脚本都和源代码一起托管在GitHub。团队所有成员都可以查看并修改。

相关文章
|
26天前
|
运维 持续交付 开发工具
基础设施即代码(IaC):自动化基础设施管理的未来
基础设施即代码(IaC):自动化基础设施管理的未来
36 0
|
2月前
|
机器学习/深度学习 人工智能 物联网
探索云平台:构建未来计算的基石
本文旨在深入探讨云平台的基本概念、核心优势及其在现代IT架构中的关键作用。我们将从云计算的起源讲起,逐步解析云平台的运作机制,并通过具体案例展示其如何推动企业创新和效率提升。无论是创业者还是资深技术专家,了解云平台的本质和发展动向,都是把握未来科技趋势的重要一步。
85 2
|
3月前
|
JSON 持续交付 数据中心
基础设施即代码(IaC)的实现途径
【8月更文挑战第18天】基础设施即代码(IaC)是现代云计算和DevOps实践中不可或缺的一部分。通过编写代码来定义和管理基础设施,可以实现自动化、可重复性、易于维护和高度可扩展的基础设施管理。通过选择合适的工具和方法,遵循最佳实践,企业可以显著提升基础设施的部署效率和管理水平。
|
3月前
|
消息中间件 运维 Cloud Native
核心系统转型问题之快速集成不同技术体系构建的应用系统如何解决
核心系统转型问题之快速集成不同技术体系构建的应用系统如何解决
|
3月前
|
监控 安全 网络安全
如何构建安全的网络基础设施:全面指南
【8月更文挑战第2天】构建安全的网络基础设施是一个复杂而持续的过程,需要企业从规划、设计、实施到维护等各个环节都给予足够的重视和投入。通过全面的风险评估、合理的安全策略、科学的设计方案、严格的实施流程和持续的监控优化,可以为企业打造一个坚不可摧的网络安全防线。在这个过程中,企业应始终保持对新技术和新威胁的敏锐洞察力,不断优化和完善安全体系,确保网络基础设施的安全稳定运行。
|
6月前
|
运维 持续交付 云计算
云计算中的基础设施自动化:IaC(基础设施即代码)的崛起与实践
云计算中的基础设施自动化:IaC(基础设施即代码)的崛起与实践
248 0
|
弹性计算 运维 Kubernetes
|
监控 安全 API
云计算对应用程序和架构设计的安全影响
应用安全包含了一个非常复杂和庞大的知识体系:从早期设计和威胁建模去维护 和防护生产应用程序。随着应用程序开发实践的不断进步和采用新的流程、模式和技术,应用安全也在以难以置信的速度发展。云计算是这些进步的最大驱动因素之一, 它会产生相应的压力,使应用安全的状态发生变化,以确保这种进展尽可能安全地继续下去。本篇文章旨为希望在云计算环境中安全的构建和部署应用程序,特别是 PaaS 和 IaaS 的软件开发团队而提出的有助于减少常见安全问题若干建议
912 0
|
数据中心
数据中心模块化和标准化(5-2)
本文引用图片为网络公开材料的图片或笔者自行创作图,尽量从个人专业角度解释一些人们本该了解并一直没弄清楚技术本质,不代表本人所在公司的任何观点和看法;论述针对技术和科学本身,不针对任何公司的技术或产品;
791 0