什么是基础设施即代码 (IaC)
随着 DevOps 的发展,了解其工作原理将大有裨益。DevOps 的一大亮点是“基础设施即代码”。这意味着,你对待基础设施的方式与对待应用程序代码的方式完全相同。因此,你需要将其提交到版本控制中,为其编写测试,并确保它与跨多个环境的现有代码保持一致。
将基础设施即代码处理可以避免诸如意外的代码更改以及生产和开发等环境之间的配置差异等问题。它还能确保您执行的每次部署都完全相同。正确实施后,您无需担心手动部署中出现的那些奇怪的差异。
另外需要考虑的是,你不需要使用不同的编程语言,比如 Python 或 Go。会有一些特定于工具的语言,但这些语言通常很简单,并且有很好的文档。使用基础设施即代码,你主要改变的是你处理系统的方式。
您无需登录服务器并手动进行更改,而是使用开发方法来完成这些任务。这意味着您无需处理许多公司中只有一人知道的问题。这样,每个人都可以更新和部署对基础架构的更改,并且更改的保存方式与将代码签入版本控制时相同。
虽然基础设施即代码有助于在生产中获取和保持应用程序的可靠版本的许多方面,但当您为其添加自动化功能时,它确实会增加价值。
自动化您的基础设施
您首先要考虑的事情之一是如何将代码转化为 artifact(工件)。artifact 是指构建过程中生成的任何可部署元素。例如,当您使用 React 构建的应用时,您知道npm build命令会在项目根目录中生成一个build目录。该目录中的所有内容都会被部署到服务器。
在“基础设施即代码”的场景中,这些构件指的是 Docker 镜像或虚拟机镜像之类的东西。你必须清楚基础设施代码中应该包含哪些构件,因为这些构件会像你的 React 应用一样进行版本控制和测试。基础设施构件的例子包括操作系统软件包、RPM 文件和 DEB 文件。
构建完成后,您需要像测试代码一样对其进行测试。构建完成后,您可以运行单元测试和集成测试。您还可以进行一些安全检查,以确保整个过程中不会泄露任何敏感信息。
您可以使用 Chef 或 Ansible 等工具来编写基础设施自动化。它们都可以进行单元测试,以发现任何语法错误或最佳实践违规,而无需配置整个系统。尽早检查 Linter 和格式化程序错误可以避免以后出现很多不必要的问题,因为无论有多少开发人员进行更改,它都能保持一致。您还可以编写实际测试,以确保在正确的环境中使用正确的服务器平台。您还可以检查软件包是否按预期安装。
您可以更进一步,运行集成测试来检查您的系统是否已正确配置和部署。您将能够检查是否安装了正确的软件包,以及所需的服务是否在正确的端口上运行。
您可以添加到基础架构代码中的另一种测试是安全测试。这包括确保您遵守行业法规,并确保没有打开任何可能给攻击者提供攻击途径的额外端口。编写测试的方式很大程度上取决于您决定使用的工具,我们将在下一节中介绍其中一些工具。
测试是“基础设施即代码”自动化的重要组成部分,因为它可以节省您大量的静默错误调试时间。当您准备部署基础设施并使用它持续将应用程序更新到生产环境时,您将能够追踪并修复任何可能导致问题的问题。
您使用的工具将帮助您构建管道所需的基础架构代码。市面上有许多开源和专有工具,几乎可以满足您所有的基础设施需求。
常用工具
您将看到基础设施即代码中常用的一些工具包括:
Chef
Puppet
Terraform
Conducto
CFEngine
AWS CloudFormation
Azure 资源管理器
云部署管理器
SaltStack
Anisble
Juju
Docker
Vagrant
R?ex
NixOS
您决定使用的具体工具取决于您现有的基础设施和应用程序代码,以及您需要使用的其他服务。您甚至可能会发现,这些工具的组合最适合您。对于“基础设施即代码”而言,最重要的是了解其中涉及的一切。这样,您才能更好地决定使用哪些工具以及如何构建系统。
将应用程序投入生产所需的一切
当你听到人们谈论配置时,这意味着他们正在准备服务器,以运行你想要部署的内容。这意味着你已经准备好操作系统和系统服务以供使用。你还需要检查网络连接和端口可用性等,以确保所有设备都已连接到所需的设备。
部署意味着有一个自动化流程来处理服务器上应用的部署和升级。另一个你会经常听到的术语是编排。编排有助于协调跨多个系统的操作。因此,一旦初始配置完成,编排可以确保你可以升级正在运行的系统,并且能够控制正在运行的系统。
然后是配置管理。它确保应用程序和软件包根据需要进行维护和升级。它还负责处理初始配置完成后系统配置的变更控制。配置管理中有一些重要的规则。
- 系统应该收敛到理想状态。能够基于服务器和新版本模型运行,并最终与现有模型保持一致的系统被称为收敛系统。
- 系统命令和配置应该是幂等的。这意味着您应该能够多次运行配置管理程序,并最终获得相同的状态。
- 系统应该是不可变的。这意味着部署一旦完成就无法更改。因此,如果需要更改,您需要重新部署整个系统。
- 系统应该是自助服务的。任何用户都应该能够自行启动流程,无需他人帮助。不应该有一个人掌握着如何处理配置和部署的神奇知识。
您的基础设施越复杂,遵循这些基本规则就越重要。
其他想法
如果您想知道如何使用这些工具来做一些有用的事情,这很大程度上取决于您使用的系统。如果您正在开发简单的应用程序,可能值得考虑设置 AWS CloudFormation。如果您正在考虑使用微服务,Docker 可能是与 Kubernetes 配合使用来编排微服务的好工具。
如果您在大型分布式环境中工作,例如包含自定义应用程序的企业网络,则可以考虑使用Puppet、Conducto或Chef 。如果您的网站对正常运行时间要求非常高,则可以使用Ansible或Conducto之类的编排工具。
这些并非硬性规定,因为所有这些工具都有多种用途。我这里提到的用例只是“基础设施即代码”工具的一些常见用途。希望这些用例能让您更好地了解“基础设施即代码”的实用性。
记得在Twitter 上关注我 @FlippedCoding!我经常在那里发布一些实用且随机的技术资讯。
文章来源:https://dev.to/flippedcoding/what-is-infrastruct-as-code-iac-461c