什么是基础设施即代码?对于IT团队的好处、工具和最佳实践
根据2019年《加速DevOps现状报告》的调查,80%的受访者表示,他们支持的主要应用程序或服务托管在某种云平台上。50%的受访者表示,他们的主要应用程序托管在公共云上。
为什么需要基础设施即代码?
传统上,当您需要一个服务器时,您需要提出一个工单,由运维团队的某个人创建一个虚拟机实例或订购一台物理服务器。这可以使用脚本、点和点击,甚至手动安装。
然后,随着每个请求,会有更多的虚拟机,用于DNS、邮件、数据库等等。然后,操作系统、Web服务器、JVM和其他所有东西都会进行持续更新。随着时间的推移,它们之间会有稍微不同的配置(配置漂移),导致了不同的服务器配置。当出现故障时,追踪进行的更改是一项挑战。
只要服务器数量较少且寿命较长,这种情况仍然可以接受。
随着像AWS这样的公司的出现,情况发生了很大变化。许多公司不再投资于硬件和数据中心,而是开始将他们的应用程序转移到云上。在云上,您可以在几分钟内部署一个服务器,而以前可能需要几个小时甚至几天。
为了保持最佳性能和可用性,您可能需要部署更多的实例来满足需求。然后,您可能需要终止它们以节省成本。由于按小时计费,您可能每天需要进行多次扩展或缩减。每天手动完成这个操作显然是一项具有挑战性的任务。
将部署或终止实例和其他基础结构组件所需的步骤记录在代码中可以实现自动化。云和基础设施配置的自动化可以帮助更快、更可靠地交付价值。
什么是基础设施即代码?
基础设施即代码(IaC)是使用软件开发原则和实践进行基础设施自动化。
这个想法是将基础设施视为软件,然后编写、测试和执行代码来定义、部署、更新和销毁基础设施。您编写代码来管理服务器、数据库、网络、日志、应用程序部署和配置。当您想要对基础设施进行更改时,您对代码进行更改、测试,然后将其应用到您的系统中。
好处
与手动配置相比,基础设施即代码提供了显著的好处:
自助服务
由于基础设施被定义为代码,整个过程和部署可以自动化,并且可以由团队中的任何人开始。基础设施的用户可以在需要时获取所需的资源。
幂等性
幂等意味着您定义所需的状态,无论运行脚本多少次,结果都是相同的。它检查当前状态和所需状态,并仅应用所需的更改。这在bash脚本中实现起来非常困难。
像link_2和link_3这样的工具具有内置功能,使您的代码具有幂等性。
降低成本
减少了配置所需的时间和工作量,远远少于手动配置。
更快的软件交付
快速提供开发、测试和生产环境的基础设施使您能够更快地交付软件。由于部署过程是自动化的,因此也是一致且可重复的。
自我记录
基础设施的状态在代码中定义,任何人都可以轻松阅读。
版本控制
传统上,对生产系统进行更改被认为是有风险的。但是,变化是不可避免的。当添加新功能时,您可能需要添加新的数据库。当添加新服务器或存储到集群时,您可能需要添加新服务器或存储。基础设施即代码减少了对基础设施进行更改的工作量和风险。
您可以将源文件签入版本控制,这意味着您可以跟踪对基础设施所做的所有更改,并在出现问题时快速还原到上一个版本。
验证和测试
基础设施即代码使得持续进行小的改变,并进行测试成为可能。由于一切都是代码,您可以使用静态分析和自动化测试来检查错误。
改进的安全性
基础设施即代码的转变使您能够从一开始就嵌入安全性,然后可靠且安全地应用更改。
基础设施即代码工具
虽然有很多工具可供选择,但选择一个工作的工具可能不容易。以下是一些您可能会发现有用的考虑因素:
配置管理与配置工具
广义上,可用的工具可分为两类 –
- 配置管理工具。
- 配置工具。
配置管理工具
配置管理工具旨在管理用户、安装和管理现有服务器上的软件和工具。Chef、Ansible、Puppet和SaltStack都是主要的配置工具。
您可以使用配置管理工具在服务器上安装和更新软件。
配置工具
Terraform、CloudFormation、OpenStack Heat等是配置工具,用于创建服务器、数据库服务器、负载均衡器、队列、子网、防火墙和基础设施的所有其他组件。这些工具通过API调用提供程序来创建所需的基础设施。
可变与不可变基础设施
可变基础设施是在进行配置后可以修改的基础设施。Chef、Ansible、Puppet和SaltStack旨在在现有服务器上安装或更新软件。服务器的生命周期中可能会多次进行此操作。经过多次更新后,每个服务器可能与其他服务器略有不同,导致配置漂移。例如,某些在测试服务器上运行良好的更改可能在生产服务器上无法正常工作。
Terraform和CloudFormation等工具旨在每次创建一个新的服务器,从机器镜像或容器镜像创建。如果需要更新服务器,则用新服务器替换它们。当新服务器启动后,您可以终止旧服务器。每个部署都使用一个不可变的镜像来创建服务器,从而避免配置漂移。不过,这可能会有点慢。
命令式与声明式工具
命令式工具类似于脚本。您列出要执行的步骤以达到期望的状态。声明式工具使您能够指定最终状态,工具会计算出达到该状态的步骤。
Chef主要是一种命令式工具,而Ansible使用混合方法,支持命令式和声明式技术。
Terraform、CloudFormation、Puppet、OpenStack Heat和SaltStack都属于声明式工具类别,您可以在其中声明所需的最终状态。
同时使用多个工具
虽然每个工具都可单独使用,但常见的做法是将它们一起使用。例如,您可以使用Terraform构建VPC、子网、Internet网关、负载均衡器和虚拟机,然后使用Ansible对这些实例进行配置和部署服务。
结论
基础设施定义为代码相比手动配置具有许多优势-可以进行版本控制、测试、加速配置和软件交付。许多组织已经开始采用基础设施即代码的方法来构建和管理他们的基础设施。