首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么是“基础设施作为代码”?

什么是“基础设施作为代码”?
EN

DevOps用户
提问于 2017-03-17 23:43:39
回答 2查看 1.7K关注 0票数 13

在过去两周里,在不同的情况下,“基础设施即守则”一语已被多次提及。从实际意义上讲,将基础设施作为代码意味着什么?

EN

回答 2

DevOps用户

回答已采纳

发布于 2017-03-18 05:16:11

TL;DR:基础设施为代码是一种自动化和备份环境的方法。在理想情况下,灾难发生后,您可以通过提供新资源、从代码存储库恢复配置和从备份中恢复数据来全面和自动地恢复基础设施。

概述

“代码”所依赖的基础设施主要有三个概念:

自动化

配置管理( Configuration )是第三代工具。在CFEngine的基础上,一套新的自动化配置管理工具正在广泛部署。按字母顺序排列,最受欢迎的是CFEngine、厨师、木偶、PowerShell、DSC和SaltStack。每个程序都有描述基础结构状态的语言、应用这些更改并提供扩展工具的能力的代码模块、在服务器上执行这些更改的代理和中央信息库。

它们通常以推挽方式工作,或者从中央位置连接到服务器(S),远程执行更改,或者在每台服务器上运行,并从中心位置提取关于状态的信息,或者在客户机/服务器模型中,或者以分布式方式运行。

重要的概念是系统管理员或站点可靠性工程师不直接对基础设施进行更改,而是让自动化进行更改。一个人手工做的任何事情都应该被认为是易腐的,很快就会被自动化纠正,或者以更严格的形式破坏基础设施的完整性,并引发对受影响部件的破坏和重建。

代码库

代码库,理想的独立于存储库持有软件,将用于管理基础设施和相关自动化的所有更改。它应该保存配置文件和模板、描述待审查更改过程的剧本(菜谱)、扩展CM自动化工具的代码、供应配置、基础设施测试和警报、阶段/部署测试、文档、手动(尚未自动化)过程描述。

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

管理基础设施

管理物理基础设施是一项超越软件的现实世界任务,需要非常不同的技能。通过能够通过云计算或托管数据中心抽象这一层,您的团队就可以专注于管理基础设施以增加业务价值。

虽然云计算提供了一种在稍后阶段快速启动和扩展的方法,但在将基础设施的部分部分移动到自己的数据中心以建立混合模型时,公司通常会意识到一些好处,甚至节省了很多钱。拥有或租用硬件并不意味着您也必须雇用处理它的人员。在这个规模上,您需要分布在世界各地的数据中心,在所有地方都有具备所需技能的人员将非常昂贵。让它们在世界各地飞行会给任何变化和额外的低效率操作带来很大的延迟,这也是将数据中心管理外包的另一个原因。

重要的是,管理的物理基础设施经常被遗忘或忽略的概念,但同样重要。即使您已经实现了所有的自动化,所有配置都存储在一个备份的代码存储库中,除非您有一种快速提供的方法,否则您就会遇到一个巨大的瓶颈,这会很容易地抹掉其他两个步骤所带来的所有好处。

票数 12
EN

DevOps用户

发布于 2017-03-18 03:51:44

在解释它的确切含义之前,让我引用一个非常好的定义,直指从维基百科

基础设施即代码(IaC)是管理和提供计算基础设施(进程、裸金属服务器、虚拟服务器等)的过程。而其配置则通过计算机可处理的定义文件,而不是物理硬件配置或交互式配置工具。

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

此外,这也是Terraform对自己的看法:

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

这意味着,我们可以对整个潜艇进行编码。它包括创建云(/infra)资源,如服务器实例、负载平衡器等,以及完整的配置(包括基本设置调整、安全设置、区域等)作为代码,这些配置可以编辑、可编辑,当然也可以查看。

这是用于提供AWS资源的Terraform代码的示例:

代码语言:javascript
运行
复制
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"
}

另外,还需要了解供给编配工具之间的区别。开发人员经常混淆其中一种而另一种则倾向于错误地尝试调整和使用一个工具,而不是用来做它的用途。

票数 5
EN
页面原文内容由DevOps提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://devops.stackexchange.com/questions/550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档