如何开启一个基础设施即代码项目

多年来,基础设施即代码(InfrastructureasCode,IaC)一直是一种趋势。它通过定义相关标准,以及推出各种新的方法与工具,来尽可能地自动化我们的各项日常任务。例如,Ansible、Pulumi、Terraform等,都是我们耳熟能详的该领域自动化工具。由于每种工具都各有着各自的优缺点,因此,我们选择起来并不容易,而且往往需要团队通过协作,来识别、测试和定义正确的工具。毕竟此类协作的成功关键就在于,能够确保各个团队成员参与到IaC项目中,进而实现适当的自动化流程。

除了由工具选择所带来的挑战,定义项目的架构也并非易事。单存储库与多存储库各有利弊,它们能够在不同应用场景中,简化IaC项目架构的参与与协作。下面,我将和您深入讨论如何在不同的环境中,使用不同的自动化工具,来开启IaC项目。

什么是IaC项目?

基础设施即代码表示在描述性模型中,管理包括:云架构、网络、虚拟或物理服务器、以及负载平衡器在内的任何基础设施组件。由于属于基于DevOps软件开发的重要实践,因此它强调的是那些用于置备和更改系统配置的一致性、可重复的例行过程。类似于相同的源代码能够生成相同的二进制文件,IaC模型也会在每次应用时,生成相同的环境。可见,IaC是一种通过机器可读的定义文件,来提供、配置和管理IT基础设施的方法。据此,我们可以轻松地对整个基础设施的状态,进行版本控制。

总的说来,IaC项目具有如下主要优势:

提高速度:通过快速设置完整的基础设施,让软件开发的生命周期更加高效。

提高一致性:具有可重复性、一致性的自动化流程,可以避免各种手动错误。

降低成本:IaC通过良好的云计算能力和自动化策略,降低了项目在硬件、操作人员、物理资源等方面的花费,进而大幅降低了基础设施管理与维护的成本。

当然,IaC及其配套的工具与项目架构,并非DevOps团队独享,它也能够为公司内的其他工程师赋能,提高协作水平,这也是IaC成功的关键。

如何启动IaC项目?

作为一个灵活可选的架构,IaC需要根据不同的“上下文”,通过不断迭代,来提高项目的效率。也就是说,IaC项目不一定在首次就能被正确定义,它需要通过持续迭代,才能适应本公司的工作方法。下图展示了一个典型的项目目录结构。

以下是针对上述目录架构的简单解释:

Root是项目的入口,它包含了诸如:README、CONTRIBUTION等项目主要文档,以及跟踪每次更新的CHANGELOG文件。

Dist是一个由自动化脚本自动创建的可选文件夹,可用于配置本地环境,以便加入项目中的任何角色。例如,它可以将符号链接集中式地存储到“extra-tools”文件夹中,以及那些由IaC项目使用的二进制文件。

Docs存放了更多文档,以便将带有代码源的文档集中起来,以进行版本控制并保持同步。

Extra-playbooks是一个可以自动下载外部playbook的文件夹。它有效地分离了内、外部资源,以便区别哪些代码可被更新,哪些不可以。

Extra-tools是一个文件夹,其中包含了用于管理IaC架构的每个工具的二进制文件。如果它被设置为本地,则可以方便任何角色按需使用它来运行各种操作。

Inventory是自动化工具共享全局信息的位置,可为不同环境中的每一种资源进行编录。

Playbooks是项目团队开发的内部playbook的位置。

Plugins是由自动化脚本创建的可选文件夹,可用于配置本地自动化工具,以便扩展其功能。

Provision是用于提供基础设施的自动化代码的位置。它可以是云端、或是诸如Terraform、Pulumi等本地资源、以及Vagrant、Docker、Kubernetes等本地测试环境(下文会提到)。该文件夹按照不同的工具可分为多个子文件夹,以便项目团队轻松地识别并管理置备的工具。

Roles是playbook用来配置提供资源的不同角色的具体位置。

因此,这样的目录架构可用来在逻辑上,将置备(provisioning)代码与配置(configuration)代码分开,以便在同一个项目内,轻松地实现完全的自动化,且无需管理多个存储库。例如,团队可以使用Terraform去置备某个虚拟机,并使用Ansible等本地置备程序自动配置它。

如何进行团队合作

常言道:“一个人可以走得更快,但一群人才能走得更远。”可见,协作是成功的关键。以团队形式开发IaC项目,可以避免出现其他人无法理解的架构,或是选择了错误的自动化工具。值得注意的是,工程团队中的任何人都应该使用IaC项目,来自动化其流程。毕竟,DevOps方法论的主要目标,就是要缩小运维与开发人员之间的差距。而IaC项目可以通过每个人的参与,来协助实现这一点。

显然,由不同团队开发的IaC,需要项目管理人员将其划分为不同的路线图、任务、子任务,并随着时间的推移,持续跟踪进度。因此,相比掌握如何管理项目,团队更应该了解如何轻松地实现协作。

版本代码

与其他软件项目类似,IaC项目也离不开版本控制。从概念上说,版本控制是随着时间的推移,跟踪和管理源代码的更改,以防止关联性任务发生冲突的一种实践。同时,它也能够通过发布管理,按需快速回滚到过往的版本。

其中,版本规则(convention)必须事先定义和自动管理一个持续的管道,以实现对存储库、状态文件、以及bucket进行自动标记。下图展示了一个IaC项目的简单版本规则:

MAJOR的版本变化发生在引入重大更改时。例如,自动化工具的某次升级,可能会更改API的行为,或需要重写代码。

MINOR的版本变化发生在需要以向后兼容的方式添加功能时。例如,添加新的角色、引入新的工具等。

PATCH的版本变化发生在需要针对向后兼容的错误,进行修复、或格式设置时。

使用带有显式名称的分支

在开发方面,IaC项目应该遵循的另一个的实践是分支的使用。在源代码控制软件中,人们可以使用分支,将代码从生产环境版本中分离出来,用以修复错误、或添加功能。因此,分支方便了用户对开发代码执行更改,而不会对生产环境或其他成员的工作,产生影响。

值得注意的是,我们需要在创建分支时,就使用明确的名称,以确保其他成员可以顺利地引用,并快速了解到该分支是否仍在开发中。通常的做法是,使用当前任务的单号来命名分支,以便快速地参考项目管理器的标识符。

此外,我们还需要维护生产环境代码的主分支和每个子环境的专用分支。为此,我们可以定义一个工作流,让其首先在开发环境(分支)中部署每个更改,然后在缓存环境(分支)中部署更改,最后在生产环境(主分支)中发布更改。

写入显式提交消息

运营团队应该通过管控好提交消息的格式,来确保大家能够更好地理解发生的更改。为了能够从每次更新中提取到实用的信息,我们需要定义显式的提交消息规则。下图的规则示例是由可用于分析项目、并快速了解成熟度的信息所组成。它包括:类型(Type)、范围(Scope)和摘要(Summary)三个组成部分。其中,类型定义了提交的全局目的,范围定义了项目的哪个子组件会受到影响,而摘要则限定80个字符来快速描述更新。

文档(Docs):属于更新类文档,类似README文件。

功能(Feat):向项目添加新的功能。

修复(Fix):修复错误的代码更新。

重构(Refactor):对不引入新功能的代码予以更新。

格式(Format):代码的纠错(linting)。

测试(Test):单元测试中的代码更改。

持续集成(Ci):持续集成过程中的代码更改。

在规则上,我们需要使用较小的提交方式,以便轻松地找到待使用的提交类型。如果您无法确定待使用的模式,则需拆分成多个提交。您可以参考一个名为git-semantic-


转载请注明:http://www.aierlanlan.com/cyrz/5242.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了