传统上,基础设施是通过用户界面甚至是命令行工具来配置的。这是快速和简单的,但往往会导致基础设施在重现或进行安全修改方面具有挑战性。基础设施即代码解决了这些问题,但也引入了一些复杂的问题,最初可能会让人望而生畏。然而,像Terraform这样的基础设施即代码(IaC)工具并不像一些人认为的那样难学,知道如何使用它们可以为你的职业生涯带来巨大的好处。我们将在这篇文章中看看Terraform的好处,因为它是目前最流行的IaC工具之一。
Terraform几乎已经成为基础设施即代码(IaC)运动的同义词。历史上通过用户界面管理的基础设施带来了许多挑战,通过代码配置可以解决这些问题。用代码创建和管理基础设施,在降低风险和提高生产力方面有无数的好处。
来自Hashicorp的Terraform是一个平台无关的工具,它以人类可读的代码定义基础设施。虽然Terraform不是唯一的IaC工具,但由于其可扩展性和较浅的学习曲线,它已迅速成为最受欢迎的工具。
为什么基础设施即代码很重要
通过一个简单的配置文件创建云资源或设置监控,为工程或基础设施团队提供了巨大的好处。用代码配置基础设施提供了许多减少风险的方法,即增加稳定性,包括:
- 可追溯性
- 可重复性
- 自动化
- 文档
可追溯性是使用Terraform管理基础设施的最明显的好处。作为最佳实践,Terraform的代码通常用git进行跟踪。当有人想改变基础设施的配置方式时,他们会打开一个拉动请求,并可能得到同行们的评论。当基础设施的改变出错时,造成问题的改变就像其他错误的代码一样容易找到。对所有基础设施有一个清晰的变更日志,可以降低风险,并为任何团队创造信心。
此外,将基础设施作为代码创建和管理的另一个明显的好处是可重复性。为你的微服务平台创建的每一个监控器都在代码中精确定义,如果你的现有设置发生任何问题,你可以轻松地重新创建你的监控设置。
基础设施作为代码的另一个优势是,创建基础设施的实际步骤是自动化的。与人工创建基础设施相比,用接近纯英文的方式来声明基础设施不那么繁琐和容易出错。Terraform代码描述的是创建或改变后基础设施的最终状态,而不是进行改变的指令。提供者将声明性代码转化为与界面API兼容的命令性指令。这既方便又安全,因为它消除了管理工程资源的手动和容易出错的过程。
作为代码的基础设施也可以作为文件。通常情况下,非开发人员可以看一下Terraform,对将要产生的东西有一个很好的概念。这可能是足够抽象的,以至于解释起来很有难度,但深入了解代码就会发现运行时将会产生什么。事实上,在应用一个计划之前,在本地运行该计划,可以准确地发现在生产中应用该计划时将创建或销毁什么。此外,你可以在暂存环境中运行计划,直接观察创建的基础设施。在创建基础设施的同时,关于基础设施本身的文档允许团队更容易协作,甚至执行代码审查和创建拉动请求,以确保遵循最佳实践。
Terraform代码如何成为基础设施
Terraform并不直接从代码中创建基础设施。HashiCorp称描述基础设施的文件组为 "配置"。Terraform的配置依赖于一个提供者,它与所需的客户端接口,直接创建和管理基础设施。Terraform提供者创建了一个执行计划,明确描述了将要进行的改变。在审查该计划后,开发人员和工程师可以应用该计划来执行其中指定的操作。
Terraform社区(包括其创建者HashiCorp)已经发布了近2000个提供者,可以立即用于解释和执行Terraform代码。今天可以随时访问的一些提供者有:
- 亚马逊网络服务
- 蔚蓝科技
- Splunk
- Datadog
- 谷歌云
- Sentry
- Github
- (更多!)
如果你需要Terraform与一些还没有提供商的东西进行交互,你可以写一个!提供者是使用HashiCorp提供的Terraform库用Go编写的。提供者将与你正在工作的任何系统的客户端库对接,并对该系统的API进行HTTP调用。
用Terraform创建一个AWS S3桶
创建云资源是Terraform可以为团队抽象出的许多任务之一。定义云资源的细节是相对直接的,我们将以AWS S3为例(S3=简单存储解决方案)。这是一个云存储,你可以手动或通过API上传和下载几乎任何类型的文件。Azure和谷歌云都有类似的产品,但对于这个例子来说,S3就足够了。
设置AWS凭证
如果你还没有AWS的账户,你可以快速创建一个免费的账户。一旦你完成了,或者如果你已经有一个账户,你将需要为Terraform创建一个IAM(身份和访问管理)角色来连接。在AWS网络控制台,搜索并选择IAM。在左侧菜单中,选择 "用户",然后点击 "创建一个新用户"。
给它一个可识别的名字,如terraform-provider,然后选择 "访问密钥 - 程序化访问",然后进入权限。在这里你将选择你希望Terraform能够代表你的IAM角色做什么。对于本教程,你可以搜索 "S3 "并选择 "AmazonS3FullAccess"。最后,你可以跳过标签,选择 "创建用户"。记下你的访问ID和密匙,因为这将是你查看它们的唯一机会。
基础设施传统上是通过用户界面甚至是命令行工具来配置的。这是快速和简单的,但往往会导致基础设施在重现或进行安全修改方面具有挑战性。基础设施即代码解决了这些问题,但也引入了一些复杂的问题,最初可能会让人望而生畏。然而,像Terraform这样的基础设施即代码(IaC)工具并不像一些人认为的那样难学,知道如何使用它们可以为你的职业生涯带来巨大的好处。我们将在这篇文章中看看Terraform的好处,因为它是目前最流行的IaC工具之一。
Terraform几乎已经成为基础设施即代码(IaC)运动的同义词。历史上通过用户界面管理的基础设施带来了许多挑战,通过代码配置可以解决这些问题。用代码创建和管理基础设施,在降低风险和提高生产力方面有无数的好处。
来自Hashicorp的Terraform是一个与平台无关的工具,它以人类可读的代码定义基础设施。虽然Terraform不是唯一的IaC工具,但由于其可扩展性和较浅的学习曲线,它已迅速成为最受欢迎的工具。
为什么基础设施即代码很重要
通过一个简单的配置文件创建云资源或设置监控,为工程或基础设施团队提供了巨大的好处。用代码配置基础设施提供了许多减少风险的方法,即增加稳定性,包括:
- 可追溯性
- 可重复性
- 自动化
- 文档
可追溯性是使用Terraform管理基础设施的最明显的好处。作为最佳实践,Terraform的代码通常用git进行跟踪。当有人想改变基础设施的配置方式时,他们会打开一个拉动请求,并可能得到同行们的评论。当基础设施的改变出错时,造成问题的改变就像其他错误的代码一样容易找到。对所有基础设施有一个清晰的变更日志,可以降低风险,并为任何团队创造信心。
此外,将基础设施作为代码创建和管理的另一个明显的好处是可重复性。为你的微服务平台创建的每一个监控器都在代码中精确定义,如果你的现有设置发生任何问题,你可以轻松地重新创建你的监控设置。
基础设施作为代码的另一个优势是,创建基础设施的实际步骤是自动化的。与人工创建基础设施相比,用接近纯英文的方式来声明基础设施不那么繁琐和容易出错。Terraform代码描述的是创建或改变后基础设施的最终状态,而不是进行改变的指令。提供者将声明性代码转化为与界面API兼容的命令性指令。这既方便又安全,因为它消除了管理工程资源的手动和容易出错的过程。
作为代码的基础设施也可以作为文件。通常情况下,非开发人员可以看一下Terraform,对将要产生的东西有一个很好的概念。这可能是足够抽象的,以至于解释起来很有难度,但深入了解代码就会发现运行时将会产生什么。事实上,在应用一个计划之前,在本地运行该计划,可以准确地发现在生产中应用该计划时将创建或销毁什么。此外,你可以在暂存环境中运行该计划,直接观察所创建的基础设施。在创建基础设施的同时,关于基础设施本身的文档可以让团队更容易合作,甚至进行代码审查和创建拉动请求,以确保遵循最佳实践。
Terraform代码如何成为基础设施
Terraform并不直接从代码中创建基础设施。HashiCorp称描述基础设施的文件组为 "配置"。Terraform的配置依赖于一个提供者,它与所需的客户端接口,直接创建和管理基础设施。Terraform提供者创建了一个执行计划,明确描述了将要进行的改变。在审查该计划后,开发人员和工程师可以应用该计划来执行其中指定的操作。
Terraform社区(包括其创建者HashiCorp)已经发布了近2000个提供者,可以立即用于解释和执行Terraform代码。今天可以随时访问的一些提供者有:
- 亚马逊网络服务
- 蔚蓝科技
- Splunk
- Datadog
- 谷歌云
- Sentry
- Github
- (更多!)
如果你需要Terraform与一些还没有提供商的东西进行交互,你可以写一个!提供者是使用HashiCorp提供的Terraform库用Go编写的。提供者将与你正在工作的任何系统的客户端库对接,并对该系统的API进行HTTP调用。
用Terraform创建一个AWS S3桶
创建云资源是Terraform可以为团队抽象出的许多任务之一。定义云资源的细节是相对直接的,我们将以AWS S3为例(S3=简单存储解决方案)。这是一个云存储,你可以手动或通过API上传和下载几乎任何类型的文件。Azure和谷歌云都有类似的产品,但对于这个例子来说,S3就足够了。
设置AWS凭证
如果你还没有AWS的账户,你可以快速创建一个免费的账户。一旦你完成了,或者如果你已经有一个账户,你将需要为Terraform创建一个IAM(身份和访问管理)角色来连接。在AWS网络控制台,搜索并选择IAM。在左侧菜单中,选择 "用户",然后点击 "创建一个新用户"。
给它一个可识别的名字,如terraform-provider,然后选择 "访问密钥 - 程序化访问",然后进入权限。在这里你将选择你希望Terraform能够代表你的IAM角色做什么。对于本教程,你可以搜索 "S3 "并选择 "AmazonS3FullAccess"。最后,你可以跳过标签,选择 "创建用户"。记下你的访问ID和密匙,因为这将是你查看它们的唯一机会。
在你的机器上设置Terraform
如果你还没有,你将需要在你的机器上安装Terraform。这在自制软件中是最容易做到的,方法是运行
brew tap hashicorp/tap
接着是:
brew install hashicorp/tap/terraform
编写配置
就像我们前面提到的,配置就是Terraform所说的定义一块基础设施的代码。Terraform的配置必须在自己的目录中,所以在你的机器上为这个项目创建一个新的目录。
在该目录中,创建一个名为main.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.16"
}
}
required_version = ">= 1.2.0"
}
variable "access_key" {
description = "AWS IAM access key"
type = string
sensitive = true
}
variable "secret_key" {
description = "AWS IAM secret key"
type = string
sensitive = true
}
provider "aws" {
region = "us-east-1"
access_key = var.access_key
secret_key = var.secret_key
}
resource "aws_s3_bucket" "create-my-bucket" {
bucket = "some-bucket-name-that-must-be-globally-unique"
}
属于terraform关键字的第一个块是配置/设置部分。第二块,provider表示你想把Terraform代码翻译成基础设施的提供者,以及对提供者的设置。在这种情况下,我们指定AWS将创建我们资源的理想区域。最后一节向提供者指定,我们想要一个具有指定名称和默认设置的S3桶。
接下来,在同一目录下添加一个名为testing.tfvars 的新文件,该文件将容纳你的AWS凭证:
access_key = "<aws_iam_access_key>"
secret_key = "<aws_iam_secret_key>"
应用该计划
接下来,通过运行初始化该目录:
terraform init
格式化你的Terraform配置是一个最佳做法,你可以通过运行来快速完成:
terraform fmt
给定的配置已经被格式化,所以你应该看到没有变化。你还应该验证你的配置是否会在指定的计划下产生有效的结果,你可以通过运行以下命令来实现。
terraform validate
同样,给定的配置已经是有效的了,所以你应该看到一个成功的消息!剩下的就是通过运行计划来实际创建一个S3桶:
terraform apply -var-file=testing.tfvars
只要运行没有错误,你就可以访问S3部分并查看你新创建的桶了
CI中的Terraform与Semaphore
Terraform可以在Semaphore上作为CI/CD管道的一部分运行。要做到这一点,你首先需要在有terraform配置的目录下创建一个资源库:
git init
接下来,创建一个.gitignore 文件,并在其中添加以下内容:
# Local .terraform directories
**/.terraform/*
# .tfstate files
*.tfstate
*.tfstate.*
# Crash log files
crash.log
crash.*.log
# Exclude all .tfvars files, which are likely to contain sensitive data, such as
# password, private keys, and other secrets. These should not be part of version
# control as they are data points which are potentially sensitive and subject
# to change depending on the environment.
*.tfvars
*.tfvars.json
# Ignore override files as they are usually used to override resources locally and so
# are not checked in
override.tf
override.tf.json
*_override.tf
*_override.tf.json
# Include override files you do wish to add to version control using negated pattern
# !example_override.tf
# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan
# example: *tfplan*
# Ignore CLI configuration files
.terraform*
terraform.rc
在提交其他东西之前,先阶段性地提交这个文件。
接下来,对你的代码进行分级,提交,并将其推送到Github上的一个新的私有仓库。
最后,注册semaphore--如果你在Github上注册,那是最简单的,可以省去以后的一些Github配置。爱好计划将适用于这个例子。
如果你已经将AWS的秘钥提取到环境变量中,现在是在Semaphore中设置组织级别的好时机。接下来,在Semaphore中选择 "创建新",并连接你的Github仓库。在设置工作流程时,选择标准的Ubuntu单一工作环境,因为它预装了Terraform。 接下来,只需用Semaphore配置你的CI工作,在推送到主库时运行terraform plan ,以及其他你可能想要的东西
当开发者不惧怕Terraform的时候,每个人都是赢家
开发人员通常并不完全负责创建和管理基础设施,但如果他们能轻松地这样做,每个人都会受益。许多开发者对Terraform感到不安,因为它比UI或命令行工具带来了轻微的复杂性。开发人员普遍认为学习曲线有点陡峭,尤其是在学习如何正确使用新的Terraform提供者时。网站可靠性工程师经常提倡甚至强制要求基础设施甚至监控工具使用Terraform进行配置,因此熟悉Terraform可以使开发人员更好地参与和协作。使用Terraform配置基础设施的好处是显而易见的,而且学习曲线也不像看起来那么陡峭,所以不要害怕尝试它