基础设施即代码基础
了解基础设施即代码(IaC)及其优势,以及用于实现IaC的工具。
什么是 IaC?
IaC(基础设施即代码)是组织为实现IT基础设施的自动化和协同管理而提出的一种理念,旨在高效地管理和扩展其基础设施。
IaC 是一种将基础设施以文本形式、可读的配置文件来描述的方法,而不是通过图形界面或交互式软件应用/网页界面手动配置资源。
IaC 抽象掉了手动操作硬件配置所带来的管理开销和复杂性。
IaC 的优势
采用手动方式管理 IT 基础设施成本更高,容易出错且耗时。IaC 的主要优势包括:
- 高效性
- 一致性
- 开放性
- 降低成本并减少错误
- 快速响应
IaC 工具
借助 AWS、Microsoft Azure 和 Google Cloud Platform 等科技巨头提供的公共云解决方案,基础设施管理变得更加便捷。然而,在本地环境和云环境中手动操作不同工具时,仍可能出现不一致的情况。
这正是 IaC 工具发挥作用的地方——帮助组织最大化其基础设施自动化的效率。
IaC 工具主要分为两类:
- 编排工具
- 配置管理工具
目前最常用的 IaC 工具包括以下几类:
编排工具
编排工具用于基础设施的创建与管理。该类别中的代表性工具有:
- CloudFormation
- Terraform
- ARM 模板
- Google Cloud Deployment Manager
配置管理工具
配置管理工具用于管理正在运行的基础设施的配置和软件状态。此外,还有其他工具专门用于容器化工作负载和虚拟机的基础设施自动化。下表列出了常见的配置管理工具及其他相关工具。
配置管理工具
| 配置管理工具 | 其他工具 |
|---|---|
| Ansible | Docker |
| Salt/Saltstack | Packer |
| Chef | Vagrant |
| - | Puppet |
IaC 的两种实现方式
在 IaC 中,定义配置文件主要有两种方法:
- 命令式(Imperative)方法
- 声明式(Declarative)方法
命令式方法
在这种方法中,通过一系列明确的操作步骤来定义自动化流程。属于此类的工具包括:Chef 和 AWS CLI。
声明式方法
在此方法中,只需定义期望的基础设施状态,由自动化平台自行判断如何实现该状态。属于此类的工具包括:Puppet 和 Terraform。
部分工具如 Ansible 和 SaltStack 同时支持命令式和声明式两种模式。
S3 存储桶部署实战演练
下面我们通过 Terraform 使用声明式语法,或通过 AWS CLI 使用命令式语法,来演示如何定义和部署一个 S3 存储桶。
以下代码展示了使用 Terraform 的声明式语法创建 S3 存储桶的方法。请按以下步骤操作:
-
注意 第 1 至 10 行,我们定义了 Terraform 块,指定了所使用的 Terraform 版本以及希望使用的 AWS 提供商版本。
-
再看 第 12 行,我们配置了 Terraform 使用
access_key、secret_key和指定的 AWSregion与 AWS 提供商进行身份验证。 -
要创建 S3 存储桶,首先需要生成一个随机的唯一标识符,并将其附加到存储桶名称末尾。请复制下方代码并添加到
main.tf文件末尾:
为存储桶名称定义随机十六进制值
1resource "random_id" "sample" { 2 byte_length = 4 3}
-
接下来,复制以下代码片段并添加到
main.tf文件末尾。我们调用了名为my_bucket的aws_s3_bucket资源,并设置以下参数:bucket名称:my-first-bucket与生成的随机十六进制值拼接而成name标签值为My first bucketenvironment标签值为Staging
定义 S3 存储桶资源
1resource "aws_s3_bucket" "my_bucket" { 2 bucket = "my-first-bucket-${random_id.sample.hex}" 3 4 tags = { 5 Name = "My first bucket" 6 Environment = "Staging" 7 } 8}
-
在终端中运行
terraform init命令,初始化 Terraform 后端。 -
运行
terraform plan命令,查看执行计划。 -
使用
terraform apply命令在 AWS 上部署 S3 存储桶,然后在提示时输入yes。
如果改用 AWS CLI 实现相同功能,仅需执行以下命令:
使用 AWS CLI 部署 S3 存储桶
1aws s3 mb s3://<bucket-name> --region <region-name>
注意: 请确保使用唯一的存储桶名称,例如添加十六进制后缀:
my-sample-1a3468。若成功,该命令将返回make_bucket: my-sample-1a3468。
No configuration found for ID: 0815f56e3c1b6bfce01e7e655753452d9556ff215353ca59b9ec8b021f0ccfc8
观察发现,我们只需提供所需的存储桶名称和目标区域。使用 AWS CLI 属于命令式方法,因为 CLI 自动处理创建过程;而 Terraform 则要求我们显式、声明式地定义所有需求。