在过去的两周中,在不同的环境中多次提到“基础设施即代码”一词。将基础架构作为代码在实际意义上实际上意味着什么?

#1 楼

TL; DR:“基础结构即代码”是一种自动化和备份环境的方法。在理想情况下,灾难发生后,您可以通过供应新资源,从代码存储库还原配置以及从备份恢复数据来完全自动地还原基础结构。

概述

基础结构as Code依赖三个主要概念:配置管理自动化,称为连续配置自动化,这是由教授开创的领域。 Mark Burgess
用于基础结构变更的代码存储库,其中的变更首先被提交,记录,审查,测试,然后通过自动化进行部署。
托管基础结构配置。基础架构即服务(IaaS)。通过云计算,私有云或托管云或托管数据中心服务

自动化

配置管理是第三代工具。现在,在CFEngine的基础上,广泛部署了一套用于自动配置管理的新工具。最受欢迎的字母顺序是Ansible,CFEngine,Chef,Puppet,PowerShell DSC和SaltStack。每个组件都有一种语言来描述您的基础结构状态,代码模块来应用那些更改并提供扩展工具的能力,一些代理程序来在服务器上执行那些更改以及一个信息的中央存储库。

它们通常将以推或拉模式运行,或者从中央位置连接到服务器并远程执行更改,或者在每台服务器上运行,并从中央位置以及客户端/服务器模型或分布式方式中获取有关状态的信息。

重要的概念是系统管理员或站点可靠性工程师不要直接对基础结构进行更改,而应由自动化来进行更改。人工完成的任何操作均应被视为易腐烂,应由自动化立即纠正或以更严格的形式被破坏,这将破坏基础结构的完整性,并触发受影响的组件的破坏和重建。

代码存储库

代码存储库最好与存储库保存软件分开,将用于管理对基础结构和相关自动化的所有更改。它应包含配置文件和模板,描述要检查的更改过程的剧本(Cookbook),扩展CM自动化工具的代码,置备配置,基础结构测试和警报,登台/部署测试,文档,手册(尚未自动化)流程说明。

重要的概念是对更改进行同行评审,具有所有更改的记录,并在出现不可预测和/或未经测试的问题时能够自动恢复到以前的状态,并且能够部署到暂存环境并测试配置更改以及自动部署更改的能力,而不会因人为错误而导致更改。

受管理的基础结构

管理物理基础结构是一项现实世界的任务,它不仅涉及软件,而且需要非常不同的技能。通过能够通过云计算或托管数据中心抽象该层,您可以让您的团队专注于管理基础架构以增加业务价值的部分。

尽管云计算提供了一种在稍后阶段快速启动和扩展的方法,但公司通常会在混合模型的自己数据中心中移动基础架构的某些部分时获得一些好处,甚至可以节省很多钱。拥有或租用硬件并不意味着您也必须聘请处理硬件的人员。在这种规模下,您需要分布在全球各地的数据中心,而在所有地方拥有具备所有必需技能的人员将非常昂贵。在全球范围内飞行它们会增加任何更改的延迟,并增加运营效率,这是将数据中心管理外包的另一个原因。
重要的一点是,托管物理基础架构经常被遗忘或被忽略的概念,但同样重要。即使您已将所有工作自动化,所有配置都存储在备份的代码存储库中,除非您有快速配置的方法,否则您将面临巨大的瓶颈,这很容易消除其他两个步骤所带来的所有好处。

#2 楼

在解释其确切含义之前,让我引用一个非常好的定义,直接来自Wikipedia:



基础架构即代码(IaC)是管理和配置计算基础架构的过程。 (进程,裸机服务器,
虚拟服务器等)及其通过计算机可处理的定义文件进行配置,而不是通过物理硬件
配置或使用交互式配置工具进行配置。


好吧,现在让我们来看一个这样的IaC工具Terraform以便更好地理解概念:https://www.terraform.io/

是Terraform对自己的评价:


Terraform使您能够安全,可预测地创建,更改和改善生产基础结构。它是一个开源工具,可以将API编码为声明性配置文件,可以在团队成员之间共享
,将其视为代码,进行编辑,审阅和
版本化。


这意味着,一个人可以对整个基础进行编码。其中包括创建云(/ infra)资源(例如服务器实例,负载平衡器等)以及完整的配置(包括基本设置调整,安全设置,区域等)作为代码,并且可以进行编辑,版本控制和当然,这是可以审查的。

这是用于配置AWS资源的Terraform代码的示例示例:

resource "aws_elb" "frontend" {
  name = "frontend-load-balancer"
  listener {
    instance_port     = 8000
    instance_protocol = "http"
    lb_port           = 80
    lb_protocol       = "http"
  }

  instances = ["${aws_instance.app.*.id}"]
}

resource "aws_instance" "app" {
  count = 5

  ami           = "ami-408c7f28"
  instance_type = "t1.micro"
}


奖金PS:另外,一个需求了解预配和编排工具之间的差异。开发人员经常将彼此混淆,并且往往会犯错误,即尝试对其进行调整并使用其不打算使用的工具。