【.com快速翻译】基础设施即代码(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是由自动化脚本自动创建的可选文件夹,可用于配置本地环境以加入项目中的任何角色。例如,它可以将符号链接以及IaC项目使用的那些二进制文件集中存储到“extra-tools”文件夹中。Docs托管更多文档,以将文档与代码源集中在一起,以进行版本控制并保持同步。extra-playbooks是一个可以自动下载外部playbook的文件夹。它有效地分离了内部和外部资源,以区分哪些代码可以更新,哪些不可以。Extra-tools是一个文件夹,其中包含用于管理IaC框架的每个工具的二进制文件。如果设置为本地,任何角色都可以使用它来按需运行各种操作。库存是自动化工具共享全局信息的地方,对不同环境中的每种资源进行分类。剧本是项目团队开发的内部剧本所在的位置。插件是由自动化脚本创建的可选文件夹,可用于配置本地自动化工具以扩展其功能。Provision是用于配置基础设施的自动化代码的位置。可以是云端,也可以是Terraform、Pulumi等本地资源,也可以是Vagrant、Docker、Kubernetes等本地测试环境(下文会提到)。该文件夹可以分为不同工具的子文件夹,以便项目团队可以轻松识别和管理已配置的工具。Roles是playbook用来配置提供资源的不同角色的具体位置。因此,可以使用这样的目录结构将供应代码与配置代码在逻辑上分开,从而可以在同一个项目中轻松实现完全自动化,而无需管理多个存储库。例如,团队可以使用Terraform来配置虚拟机,并使用Ansible等本地配置程序来自动配置它。如何进行团队合作俗话说:“一个人可以走得更快,一群人才能走得更远”。可见,协作是成功的关键。团队开发IaC项目可以避免拥有其他人无法理解的架构,或选择错误的自动化工具。值得注意的是,工程团队中的任何人都应该使用IaC项目来自动化他们的流程。毕竟,DevOps方法论的主要目标是弥合运营与开发人员之间的鸿沟。而IaC项目可以通过每个人的参与帮助实现这一目标。显然,不同团队开发的IaC需要项目经理将其划分为不同的路线图、任务、子任务,并随着时间的推移跟踪进度。因此,团队应该知道如何轻松协作,而不是知道如何管理项目。版本代码与其他软件项目类似,IaC项目也离不开版本控制。从概念上讲,版本控制是跟踪和管理源代码随时间变化的做法,以防止相关任务之间发生冲突。同时,还可以通过发布管理按需快速回滚到之前的版本。其中,版本规则(约定)必须提前定义,并自动管理一个连续的管道,实现repositories、statefiles、buckets的自动标记。下图显示了IaC项目的简单版本控制规则:引入重大更改时会发生MAJOR版本更改。例如,自动化工具的升级可能会改变API的行为或需要重写代码。当需要以向后兼容的方式添加功能时,会发生对MINOR的版本更改。例如,添加新角色、引入新工具等。PATCH版本更改发生在需要修复错误或格式化以实现向后兼容性时。使用具有显式名称的分支IaC项目在开发方面应遵循的另一种做法是使用分支。在源代码控制软件中,人们使用分支将代码与生产版本分开,以修复错误或添加功能。因此,分支便于用户对开发代码进行更改,而不影响生产环境或其他成员的工作。值得注意的是,我们在创建分支时需要使用清晰的名称,以保证其他成员能够顺利引用,快速知道该分支是否还在开发中。通常的做法是用当前任务的单个编号来命名分支,以便快速参考项目经理的标识符。此外,我们需要维护生产代码的主分支和每个子环境的专用分支。为此,我们可以定义一个工作流,首先在开发环境(分支)部署每个变更,然后在缓存环境(分支)部署变更,最后在生产环境(master分支)发布变更。编写明确的提交消息Ops团队应该管理提交消息的格式,以确保更好地理解更改。为了能够从每次更新中提取有用的信息,我们需要定义明确的提交消息规则。下图中的示例规则由可用于分析项目并快速了解其成熟度的信息组成。它包括:类型(Type)、范围(Scope)和概要(Summary)三个组成部分。其中,类型定义了提交的全局目的,范围定义了项目的哪个子组件将受到影响,摘要限制在80个字符以内快速描述更新。文档(Docs):属于更新型文档,类似于README文件。特性(Feat):为项目添加新的特性。Fix(修复):修复错误的代码更新。重构:更新不引入新功能的代码。格式(Format):代码纠错(linting)。测试:单元测试中的代码更改。持续集成(Ci):在持续集成期间更改代码。通常,我们需要使用较小的提交,以便我们可以轻松找到要使用的提交类型。如果不确定使用哪种模式,则需要拆分为多个提交。你可以参考一个名为git-semantic-commits的Github项目。它显示了在命令行上自动创建提交消息的格式。为确保每个贡献者都遵循此格式,我们可以将预提交规则应用于任何源代码控制器软件。毕竟commit信息对于多人协作的项目来说是非常重要的。如果使用得当,它可以在很多方面提供帮助,尤其是在错误修复和回滚期间。CodeReview在团队协作的过程中,CodeReview也是一个重要的环节。为了保证软件质量,团队会通过查看和阅读部分IaC代码来发现潜在的错误,然后决定是继续执行还是中断执行。在将代码合并到master分支(也称为生产)之前,基本流程应该至少获得一次批准。促进项目启动(On-Boarding)贡献者只有在了解项目的基本概念、各种最佳实践以及如何提交首次更新的基础上,才能通过协同参与来启动项目。影响IaC项目启动的先决条件还包括:文档质量、代码质量、本地环境的设置、开发更新所需的时间。毕竟搭建一个新的环境是需要时间的,涉及到安装、更新、配置工具,下载依赖,配置文件等等。为了让IaC项目的贡献者更容易实现,我们可以使用自动化工具来完成各种需要的“基础”配置,让每个成员可以共享相同的本地环境配置(如:工具版本、依赖等.).当然,我们暂时不需要花时间研究如何使用正确的版本或命令来搭建环境,只需要运行一个playbook,就可以开始IaC项目了。比如我们可以把架构交给Ansible,保证Python、Terraform、Kubectl、Helm、Mitogen可以同时安装,从而轻松配置Linux、MacOS等多种环境。快速浏览可用的工具下面,让我们简单谈谈在启动IaC项目时需要特别注意的工具。使用Terraform配置Terraform是由HashiCorp开发的开源工具。它允许DevOps工程师以编程方式提供运行应用程序所需的资源。因为它基于HashiCorp语言(也称为HCL),它允许任何人通过跨多个云服务或本地数据中心配置和重新配置来轻松维护整个基础设施的状态。面对不同的配置器和模块,Terraform能够管理应用程序所需的几乎所有资源。Terraform虽然旨在使项目保持最新并同时共享多个状态,但如果没有正确遵循DevOps流程,随着时间的推移,团队协作可能会变得麻烦和复杂。在这方面,我们可以借用外部工具Atlanti来轻松管理Terraform项目中任何更新的代码审查和自动合并。当然,它也可以用来在将代码投入生产环境之前捕获各种错误和缺陷。正如测试是DevOps方法的重要组成部分一样,对于IaC项目来说也不为过。我们可以使用名为Terratest的工具来测试自动化Terraform资源。这是Gruntwork开发的一个Go库,可以为IaCwithTerraform、亚马逊、谷歌等IaaS平台(下文会提到)提供的Packer、Kubernetes集群创建和自动化各种测试,并且可以添加自动化流水线。使用Ansible配置Ansible是一个为跨平台主机提供强大自动化支持的工具。任何IT专业人员都可以使用它来管理应用程序的部署、工作站和服务器上的更新、云服务的分发、配置管理以及系统管理员的日常事务。Ansible凭借其幂等性和灵活的组件配置能力,显着提高了IT环境的可扩展性、一致性和可靠性。Ansible通过与Terraform的耦合,可以轻松管理任何应用程序所需的物理资源。与其他编程语言类似,Ansible可以定义各种文件在投入生产之前必须经过的测试和审查。目前,我们可以使用Molecule和AnsibleTest这两种不同的自动化工具。它们都非常易于使用,并且可以在Ansible的各种剧本上运行单元测试,以在审查代码之前验证代码的行为。为了提升Ansible的性能,我们可以在Ansible中集成一个名为Mitogen的Python库,大大降低Ansible在运行各种playbook时产生的压缩和流量。它非常适合那些基于Ansible的IaC项目。此外,专注于程序化语言方式的IaC工具Pulumi可以为IaC项目提供更好的灵活性,允许开发者根据需要轻松更改各种方法、架构或工具。因此,如果你熟悉Python、Go等编程语言,可以试试这个工具。在虚拟环境中本地运行代码如前所述,IaC项目可以看作是一种应用程序开发项目,需要遵循定义开发文件和测试等步骤。通常,我们应该首先在本地测试更新,然后在开发或测试环境中进行测试。对此,DevOps工程师可以使用Vagrant、Docker、Podman、Buildah、Minikube、Kind和MicroK8s等工具模拟特定环境来测试IaC项目的各个部分。例如,作为一个开源工具,Vagrant可以创建一个虚拟环境(比如基于Virtualbox)来测试软件在特定系统上的部署。Docker、Podman和Buildah可用于在容器环境中执行相同的操作。Minikube、Kind和MicroK8s也可用于在本地Kubernetes集群中执行相同的操作。通过这些不同的方法和用例,我们可以轻松地在IaC项目中进行测试,并以主动而非被动的方式解决潜在问题。使用Packer构建您自己的映像(可选)IaC项目通常由与计算资源相关的“基本”配置文件组成。基本配置文件或通用配置文件是自动化工具需要应用于计算资源以确保跨资源一致性的角色列表。例如,基础配置文件可能包含root密码、NTP服务器、SMTP服务器、监控工具部署等配置信息。然而,在IaC项目中,基本配置文件有时会减慢新主机的启动时间。为此,我们可以使用名为Packer的开源工具,通过创建操作系统的自定义基础映像,以编程方式减少基础配置。Packer是由HashiCorp开发的开源工具,可用于从单个配置源为多个平台创建相同的主机映像。我们可以将制作好的镜像上传到云端或者本地虚拟化编排平台(orchestratorplatform)使用。上面提到的Vagrant可以在本地使用Packer根据自定义的镜像定义生成虚拟机,然后在本地测试IaC项目的指定部分。这对于改进自定义资源的部署很有用。当然,这是否真的需要完全取决于基础设施的实际需求。在本地模拟云服务进行生产环境代码测试之前,我们可以使用一些工具在本地模拟云服务。这比为测试某段代码生成整个环境更能节省IaC项目成本。AWS用户可以使用名为LocalStack的强大工具。它可以轻松部署在本地虚拟环境(如:虚拟机或容器),模拟多个AWS端点,然后在本地测试Terraform或Ansible代码。对于GCP用户,您可以使用gcloud命令及其各种实验性功能来临时模拟有限的端点。总结综上所述,我们将为您全面介绍IaC项目的基本目录结构、团队合作、代码版本管理、命名规则、提交消息的格式、如何查看代码、启动项目以及各种实用工具.介绍启动基础设施即代码项目。如果想深入了解IaC,请参考以下链接:语义版本定义自动发布类的语义发布工具通用提交方法LocalstackwithTerraformandDockerrunningAWSlocallystack原标题:HowtoStartanInfrastructureasCodeProject,作者:NicolasGiron
