基础架构即代码(IaC)是通过机器可读的定义文件而不是物理硬件配置或交互式配置工具来管理和配置计算机数据中心资源的过程。定义可以在版本控制系统中。定义文件中的代码可以使用脚本或声明式定义,而不是通过人工流程来维护代码,但 IaC 更经常使用声明式方法。
起源 #
IaC 是为了应对公用事业计算和第二代网络框架带来的困难而发展起来的。2006 年,亚马逊网络服务公司(Amazon Web Services)推出了弹性计算云(Elastic Compute Cloud),而就在几个月前,Ruby on Rails 推出了 1.0 版本,这在企业中造成了广泛的扩展问题,而以前只有大型跨国公司才会遇到这种问题。用代码对基础架构进行建模,然后利用已知的软件最佳实践来设计、实施和部署应用基础架构的想法吸引了软件开发人员和 IT 基础架构管理员。将基础架构视为代码,并使用与其他软件项目相同的工具,可以让开发人员快速部署应用程序。
优势 #
IaC 的价值可细分为三个可衡量的类别:成本、速度和风险。
- 降低成本的目的不仅是在财务上帮助企业,而且在人力和精力方面也是如此,这意味着通过消除人工部分,人们能够将精力重新集中到其他企业任务上。
- 基础设施自动化通过在配置基础设施时更快地执行来提高速度,并旨在提供可视性,以帮助整个企业的其他团队更快、更高效地工作。
- 自动化消除了与人为错误相关的风险,如手动错误配置;消除这种风险可以减少停机时间并提高可靠性。这些成果和属性有助于企业实施 DevOps 文化,即开发和运营的结合工作。
方法类型 #
IaC 通常有两种方法:声明式(功能性)与命令式(程序性)。声明式方法与命令式方法的区别主要在于 “是什么” 与 “如何做”。
- 声明式方法关注的是最终目标配置应该是什么;
- 命令式方法关注的是如何改变基础架构来实现这一目标。命令式方法定义了需要按适当顺序执行的特定命令,以实现预期的结论。
Methods #
IaC 有两种方法:push 和 pull。主要区别在于告诉服务器如何配置的方式。
- 在 pull 中,待配置的服务器将从控制服务器拉动其配置。
- 在 push 中,控制服务器将配置推送到目标系统。
持续配置自动化 #
所有持续配置自动化(CCA)工具都可视为传统 IaC 框架的延伸。它们利用 IaC 来更改、配置和自动化基础架构,还能提供基础架构管理方式的可视性、效率和灵活性。
社区内容是决定开源 CCA 工具质量的关键因素。正如 Gartner 所说,CCA 工具的价值 “既取决于用户社区贡献的内容和支持,也取决于自动化工具的商业成熟度和性能”。Chef 有 Chef Community Repository,Puppet 有 PuppetForge。其他供应商依靠邻近的社区,并利用其他 IaC 框架,如 PowerShell DSC。新的供应商正在出现,它们不是内容驱动型,而是模型驱动型,通过产品中的智能来提供内容。这些可视化、面向对象的系统非常适合开发人员使用,但对面向生产的 DevOps 和运营人员尤其有用,因为他们重视模型而不是脚本内容。随着该领域的不断发展和变化,基于社区的内容对于如何使用 IaC 工具将变得越来越重要,除非这些工具是模型驱动和面向对象的。
Tool | Released by | Method | Approach | Written in | Comments |
---|---|---|---|---|---|
Chef | Chef (2009) | Pull | Declarative and imperative | Ruby | - |
Otter | Inedo (2015) | Push | Declarative and imperative | - | Windows-oriented |
Puppet | Puppet (2005) | Push and Pull | Declarative and imperative | C++ & Clojure since 4.0, Ruby | - |
SaltStack | SaltStack (2011) | Push and Pull | Declarative and imperative | Python | - |
CFEngine | Northern.tech | Pull | Declarative | C | - |
Terraform | HashiCorp (2014) | Push | Declarative and imperative | Go | - |
Ansible / Ansible Tower | Red Hat (2012) | Push | Declarative and imperative | Python | - |
其他工具包括 AWS CloudFormation、cdist、StackStorm、Juju、Pulumi 和 Step CI。
关系 #
与 DevOps 的关系 #
IaC 是实现 DevOps 最佳实践的关键属性。开发人员会更多地参与到配置定义中,而运营团队则会更早地参与到开发过程中。利用 IaC 的工具可实现服务器状态和配置的可视性,并最终为企业内的用户提供可视性,目的是将团队团结起来,最大限度地发挥他们的作用。自动化的总体目标是消除人工流程中的混乱和易错之处,使其更加高效、富有成效。这样就可以灵活地创建更好的软件和应用程序,减少停机时间,并为公司带来整体成本效益。IaC 的目的是降低复杂性,因为复杂性会降低人工配置的效率。自动化和协作被认为是 DevOps 的核心要点;基础设施自动化工具通常是 DevOps 工具链的组成部分。
与安全的关系 #
Unit 42(网络安全提供商 Palo Alto Networks 的威胁情报部门)发布的《2020 年云威胁报告》指出,基础设施作为代码模板存在约 20 万个潜在漏洞。