Terraform 系列-什么是 IaC?

news2024/11/28 2:38:43

系列文章

👉 Terraform 系列文章

前言

聊到 Terraform, 必然绕不开 IaC 这个概念?那么,什么是 IaC? 🤔

基本概念

基础架构即代码 (Infrastructure as Code, IaC) 是指通过代码而不是手动流程/控制台点击来管理和配置基础架构。

这里有 2 个关键词:

  • Infrastructure
  • Code

Infrastructure 是被管理对象,在这里,主要是指公有云(还有私有云、混合云等). Code 是管理方式,即像管理代码一样管理公有云资源。那么管理代码最重要的部分: 版本管理是绕不开的。

使用 IaC,创建的配置文件包含了基础设施的 spec,这使得编辑和分发配置变得更加容易。IaC 还确保每次都提供相同的环境、相同的资源、相同的配置。通过编辑和记录配置的 spec,IaC 有助于避免未记录的、临时的配置更改(当然,前提是所有人都使用 IaC,而不是还会有人在控制台点击修改导致配置漂移)。

版本控制是 IaC 的重要组成部分,配置文件应该像任何其他软件源代码文件一样受到源代码控制。 另外,随着公有云的发展,公有云的标准化的 API 也使得将基础架构组件模块化 (Terraform 里叫做 modules) 成为可能,使用者可以像搭积木一样组合这些基础的组件。比如:在 AWS 上建个静态博客,就可以组合以下组件:

  • Route53
  • CloudFront
  • S3

IaC 的两种实现方式

有两种实现 IaC 的方法:声明式命令式

声明式方法定义了系统的理想状态,包括需要的资源以及它们应该具有的任何属性,IaC 工具将自动配置它。

Terraform 就是基于 IaC 声明式的理念。在 Terraform 流行之前,另一个将声明式发扬光大的当然是:Kubernetes!

声明式方法还保留系统对象当前状态的列表,这使得拆除基础架构更易于管理。

相反,命令式方法定义了实现所需配置所需的特定命令,然后需要以正确的顺序执行这些命令。

典型的就是 Ansible.

IaC 工具通常能够在两种方法中运行,但往往更喜欢一种方法而不是另一种方法。

如 Terraform, 它更喜欢声明式的方法,但是它的 Provider、Modules、函数中仍然残留不少命令式的方法, 如:local-exec

IaC 的好处

IaC(特别是声明式的)是随着公有云而发展起来的。

置备基础设施历来是一个耗时且成本高昂的手动过程。现在基础设施管理已经从数据中心的物理硬件、虚拟化转移到容器和云计算。

借助云计算,基础设施组件的数量不断增加,每天都有更多的应用程序发布到生产环境中,并且基础设施需要能够频繁地启动、扩展和关闭。如果没有适当的 IaC 实践,管理当今基础设施的规模会变得越来越困难。

IaC 可以帮助您的组织管理 IT 基础设施需求,同时提高一致性并减少错误和手动配置。

这, 就是 IaC 的必要性。

好处

  • 降低成本
  • 提高部署速度
  • 减少(手动配置)错误
  • 提高基础设施一致性
  • 消除配置漂移

Terraform 是 IaC 领域事实上的领导者

毋庸置疑的,Terraform 是 IaC 领域事实上的领导者。

所有主流公有云,私有云,虚拟化,K8s, 容器都有在维护对应的 Terraform Provider 和 Modules.

Terraform Providers

IaC 工具

IaC 工具有哪些?目前主流的有:

声明式:

  • Terraform
  • AWS CloudFormation(🐾: 绑定 AWS)
  • Pulumi
  • CrossPlane

命令式:

  • Puppet
  • Chef
  • Ansible
  • SaltStack

为什么近期流行的都是声明式的 IaC?

我觉得主要有以下原因:

  1. Kubernetes 的标杆作用
  2. 公有云云资源以及 API 的标准化、规模化
  3. 具体到云主机,cloud-init、packer(制作云镜像越来越方便)、不可变基础设施也是原因之一。

为什么 IaC 对 DevOps 很重要?

IaC 是实施 DevOps 实践和 CI/CD 的重要组成部分。DevOps 和 CI/CD 主要是应用和组件层面的, 而 IaC 消除了开发人员的大部分配置工作,开发人员可以执行脚本让他们的基础设施准备就绪。

这样一来,应用程序部署就不会因等待基础架构而停止,系统管理员也不需要管理耗时的手动流程。那么整个开发部署迭代的流程就会越来越快, 越来越快。..

IaC 帮助您协调开发和运维,因为两个团队可以在代码仓库中看到基础架构全貌。

而且每个环境都可以使用相同的部署过程。环境一致性也有保障,开发上测试通过的,生产上出问题的概率也小。

DevOps 最佳实践也适用于 IaC 中的基础架构。基础设施可以通过与应用程序在软件开发期间相同的 CI/CD 管道,对基础设施代码应用相同的测试和版本控制。将 IaC 的 modules 代码也引入 DevOps 理念,快速测试,快速迭代。

总结

IaC 是什么?基础架构即代码 (Infrastructure as Code, IaC) 是指通过代码而不是手动流程/控制台点击来管理和配置基础架构。

IaC 有声明式和命令式两种实现方式,现在更主流的是声明式的。

为什么需要 IaC? 随着云计算带来的大量基础设施,IaC 已成必备工具。

IaC 也可以和 DevOps 流程/理念相契合。

参考资料

  • 什么是 Terraform 的基础设施即代码?
  • What is Infrastructure as Code (IaC)? | RedHat

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/423403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

互联网+制造业:图扑数字孪生智慧工厂车间生产线

前言 随着信息技术、自动化技术和人工智能等技术的快速发展和应用,智能制造已成为全球制造业发展的主流趋势。智能制造是将智能化、自动化、数字化和网络化等技术手段运用到制造过程中,使生产过程具有高度智能化、自动化和数字化的特点,进而…

Linux安装宝塔,并实现公网远程登录宝塔面板【内网穿透】

文章目录前言1. 安装宝塔2. 安装cpolar内网穿透3. 远程访问宝塔4. 固定http地址5. 配置二级子域名6. 测试访问二级子域名转发自CSDN远程穿透的文章:Linux安装宝塔,并实现公网远程登录宝塔面板【内网穿透】 前言 宝塔面板作为建站运维工具,它…

网络编程2(套接字编程)

套接字编程UDP协议通信:TCP通信:套接字编程:如何编写一个网络通信程序 1.网络通信的数据中都会包含一个完整的五元组: sip,sport,dip,dport,protocol(源IP,源…

计算机组成原理——第三章存储系统(上)

提示:吾与春风皆过客,君携秋水揽星河 文章目录前言3.1 存储系统基本概念3.2.1 主存储器的基本组成3.2.2 SRAM DRAM\3.2.3 只读存储器ROM3.3.1 主存储器与CPU的连接3.3.2 双端口RAM和多模块存储器前言 提示:以下是本篇文章正文内容&#xff0c…

带你理解运算放大器

复习一下电子设计基本元器件,运算放大器 ...... 矜辰所致目录前言一、运放基本说明1.1 基本认识1.2 运放中的电流1.3 运放工作特性二、负反馈2.1 什么是负反馈?2.2 为什么要引入负反馈?负反馈电路分析2.3 正反馈三、提一下虚短与虚断结语前…

MAX14808 八通道3级电平 数字脉冲发生器

MAX14808八通道3级电平 高压(HV) 脉冲发生器,利用低压控制逻辑输入产生高频、高压双极性脉冲(高达105V) ,用于驱动超声系统的压电传感器,MAX14808有八个集成的发送/接收(T/R)开关。 应用 超声医疗成像工业探伤检测压电驱动器测试设备 芯片…

RocketMQ 是是如何管理消费进度的?又是如何保证消息成功消费的?

RocketMQ 消费者保障 作者: 博学谷狂野架构师GitHub:GitHub 地址 (有我精心准备的 130 本电子书 PDF)只分享干货、不吹水,让我们一起加油!😄 消息确认机制 consumer 的每个实例是靠队列分配来决定如何消费消…

五、MyBatis各种查询功能

MyBatis的各种查询功能 如果查询出的数据只有一条,可以通过 实体类对象接收List集合接收Map集合接收 如果查询出的数据有多条,一定不能用实体对象接收,会抛TooManyResultsException,可以通过 实体类类型的List集合接收Map类型的L…

Python爬虫自动化从入门到精通第10天(Scrapy框架的基本使用)

Scrapy框架的基本使用Scrapy框架简介Scrapy框架的运作流程安装Scrapy框架Scrapy框架的基本操作Scrapy常用命令Scrapy框架简介 Scrapy框架主要包含以下组件: Scrapy Engine(引擎):负责Spiders、Item Pipeline、Downloader、Scheduler之间的通信&#xf…

手把手教你安装Visual Studio 2019(史上最全)

前言: 本文是以Visual Studio Community 2019为例子,介绍如何在微软官网下载Visual Studio Community 2019并安装.net桌面开发程序环境(主要是winform开发环境)。 下载请点击这里Visual Studio Community 2019下载,然后点击下图的箭头的DownLoad下载,要注意的是下载时要…

微信自定义菜单

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…

全链路压测时动态路由数据源MySQL、MongoDB、Redis

目录 一、全链路压测 二、动态路由Mysql 1. 参数配置application-localDynamic.yml 2. 加载配置参数DynamicDataSourceProperties.java 3. 动态数据源DynamicDataSource.java 4. 动态数据源供应DynamicDataSourceProvider.java 5. 动态数据源bean 6. 动态数据源上下文D…

PWN-ret2shellcode原理

我们之前做过很简单的pwn题目 buuctf-rip这种 是在程序中存在shellcode 直接返回地址改为这个shellcode的地址即可 但是如果程序里面没有呢 这种类型就是ret2shellcode 常见的shellcode shellcode "\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5…

一起读源码 —— Fastjson 的核心方法及其实现原理

源码介绍 Fastjson 是阿里巴巴开源的一个 Java 工具库,它常常被用来完成 Java 的对象与 JSON 格式的字符串的相互转化。 此文读的源码是撰写此文时 Fastjson 的最新的发布版本,即 1.2.83 下载源码 请前去 github 找到 release 最新版下载后解压&…

智慧水务之排水系统物联网监测

1.1排水系统 1.1.1监测范围选择依据 (1)管网老化、设计标准低、合流制管网区域 管网建设年代久远,通常管网发生破损问题较大;管网设计标准较低,易引发淤堵或溢流;合流制管网受天气影响大,会对…

FFMPEG: [ API ] >打开/关闭一个输入文件

它们是成对出现的. ffmpeg 把输入文件--转换成--->AVFormatContext实例 ◆ avformat_open_input() int avformat_open_input(AVFormatContext ** ps,const char * url,ff_const59 AVInputFormat * fmt,AVDictionary ** options )Open an input stream and read the header.…

跨越语言的艺术:Weblogic序列化漏洞与IIOP协议

0x01 概述 Weblogic 的序列化漏洞主要依赖于 T3 和 IIOP 协议,这两种协议在通信交互的过程中存在如跨语言、网络传输等方面的诸多问题,会给漏洞的检测和利用带来许多不便。在白帽汇安全研究院的理念中,漏洞检测和利用是一项需要创造性的工作…

速锐得新能源电动汽车整车能耗热管理CAN总线模块开发方案

一、新能源时代背景 新能源汽车浪潮席卷而来,随着汽车向电动化和智能化方向发展,对汽车能量管理的要求也越来越高。而直冷直热热泵空调热管理系统是新能源汽车领域的新蓝海,随着热管理系统的崛起,在整车能耗热管理采集模块开发方…

计算机组成原理——第四章指令系统(下)

本是青灯不归客,却因浊酒恋红尘 文章目录前言4.3.1 高级语言与机器级代码之间的对应4.3.2 常用的X86汇编指令4.3.3 ATu0026T格式和Intel格式4.3.4 选择语句的机器级表示4.3.5 循环语句的机器级表示4.4 CiSC和RiSC前言 接下来这部分主要讲的就是高级语言与汇编语言的…

Thymeleaf select回显并选中多个

语法: selected"selected" 或 selectedtrue ${#strings.indexOf(name,frag)} 或者 ${#lists.contains(list, element)} 或者 ${#strings.contains(name,ez)} 或者 ${#strings.containsIgnoreCase(name,ez)} 都可以实现。 多选示例 : &…