Terraform学习总结(1)——Terraform 简介

前言

众所周知,当企业将项目整体架构资源迁移到云上,云基础设施架构师就要根据现有项目搭建整体项目的基础设施资源的架构,然后我们的云运维工程师就要根据设计好基础设施的架构图来创建云上资源,但是在构筑的过程太单一,太传统。动动鼠标创建资源的方式成本太高,同时还有一定几率出错的风险,这种方式已经不适合现代企业迁移基础设施架构的方式。如果能够通过一种 IT 基础设施架构自动化编排工具来管理维护IT资源岂不能够大大降低企业在基础设施构建过程中成本问题,同时也可以提高云基础设施开发人员在 IAC(基础设施即代码) 方面的技能。Terraform 是一个基础设施管理工具,它允许我们以代码的方式构建、更改和管理基础设施。Terraform 并不局限于任何特定的云服务提供商,它可以与多个云提供商和环境协同工作。虽然 Azure,AWS 分明有针对自己云平台的资源管理、设置的解决方案。

(1)Azure:ARM 模板(ARM模板是一个定义项目基础结构和配置的 JavaScript 对象表示法 (JSON) 文件。 该模板使用声明性语法,使你可以指明要部署的内容,而不需要编写一系列编程命令来创建内容。 在该模板中,指定要部署的资源以及这些资源的属性。)

(2)AWS:CloudFormation(AWS CloudFormation 是一项服务,可帮助您对 Amazon Web Services 资源进行建模和设置,以便能花较少的时间管理这些资源,而将更多的时间花在运行于 AWS 中的应用程序上。您创建一个描述您所需的所有 AWS 资源(如 Amazon EC2 实例或 Amazon RDS 数据库实例)的模板,并且 AWS CloudFormation 将负责为您设置和配置这些资源。)

许可支持模块化状态管理导入现有资源可视化依赖语言验证

免费、开源,来自 Hashicorp 和社区的支持Terraform Registry中提供了一些可用于模块化模板的功能介绍和使用示例。我们可以将这些独立的模块进行拼接,使得模块之间能够建立联系。默认情况下,将状态保存在本地,但是可以使用远程状态功能将状态保存在Terraform Cloud,Storage Account可以将现有资源导入terraform来管理可以使用terraform graph命令生成配置或执行计划的直观表示。HCL是Terraform的配置语言,它是HashiCorp发明的一种声明式语言提供了检查模板文件语法错误

Terraform CLI 提供一种简单机制,用于将配置文件部署到 Azure 并对其进行版本控制,使用 Terraform 基于模板的配置文件,能够以可重复、可预测的方式定义、预配和配置 Azure 资源。在 DevOps 实践中,基础设施即代码如何落地是一个绕不开的话题。像 Chef,Puppet 等成熟的配置管理工具,都能够满足一定程度的需求,但有没有更友好的工具能够满足我们绝大多数的需求?笔者认为 Terraform 是一个很有潜力的工具,目前各大云平台也都支持的不错,尤其是使用起来简单明了。本文会简单的介绍一下 Terraform 相关的概念,然后通过一个小 demo 带大家一起进入 Terraform 的世界。说明:本文的演示环境为 ubuntu 16.04。

Terraform 是什么?

Terraform 是一种安全有效地构建、更改和版本控制基础设施的工具(基础架构自动化的编排工具)。它的目标是 "Write, Plan, and create Infrastructure as Code", 基础架构即代码。Terraform 几乎可以支持所有市面上能见到的云服务。具体的说就是可以用代码来管理维护 IT 资源,把之前需要手动操作的一部分任务通过程序来自动化的完成,这样的做的结果非常明显:高效、不易出错。

Terraform 提供了对资源和提供者的灵活抽象。该模型允许表示从物理硬件、虚拟机和容器到电子邮件和 DNS 提供者的所有内容。由于这种灵活性,Terraform 可以用来解决许多不同的问题。这意味着有许多现有的工具与Terraform 的功能重叠。但是需要注意的是,Terraform 与其他系统并不相互排斥。它可以用于管理小到单个应用程序或达到整个数据中心的不同对象。

Terraform 使用配置文件描述管理的组件(小到单个应用程序,达到整个数据中心)。Terraform 生成一个执行计划,描述它将做什么来达到所需的状态,然后执行它来构建所描述的基础结构。随着配置的变化,Terraform 能够确定发生了什么变化,并创建可应用的增量执行计划。

Terraform 是用 Go 语言开发的开源项目,你可以在 github 上访问到它的源代码。

Terraform 核心功能

  • 基础架构即代码(Infrastructure as Code)
  • 执行计划(Execution Plans)
  • 资源图(Resource Graph)
  • 自动化变更(Change Automation)

基础架构即代码(Infrastructure as Code)
使用高级配置语法来描述基础架构,这样就可以对数据中心的蓝图进行版本控制,就像对待其他代码一样对待它。

执行计划(Execution Plans)
Terraform 有一个 plan 步骤,它生成一个执行计划。执行计划显示了当执行 apply 命令时 Terraform 将做什么。通过 plan 进行提前检查,可以使 Terraform 操作真正的基础结构时避免意外。

资源图(Resource Graph)
Terraform 构建的所有资源的图表,它能够并行地创建和修改任何没有相互依赖的资源。因此,Terraform 可以高效地构建基础设施,操作人员也可以通过图表深入地解其基础设施中的依赖关系。

自动化变更(Change Automation)
把复杂的变更集应用到基础设施中,而无需人工交互。通过前面提到的执行计划和资源图,我们可以确切地知道 Terraform 将会改变什么,以什么顺序改变,从而避免许多可能的人为错误。

安装 Terraform

Terraform 的安装非常简单,直接把官方提供的二进制可执行文件保存到本地就可以了。比如笔者习惯性的把它保存到 /usr/local/bin/ 目录下,当然这个目录会被添加到 PATH 环境变量中。完成后检查一下版本号:

通过 -h 选项我们可以看到 terraform 支持的所有命令:

在 Azure 上创建一个 Resource Group

要让 Terraform 访问 Azure 订阅中的资源,需要先创建 Azure service principal,Azure service principa 允许你的 Terraform 脚本在 Azure 订阅中配置资源。请参考这里创建 Azure service principal。

配置 Terraform 环境变量
若要配置 Terraform 使用 Azure service principal,需要设置以下环境变量:

  • ARM_SUBSCRIPTION_ID
  • ARM_CLIENT_ID
  • ARM_CLIENT_SECRET
  • ARM_TENANT_ID
  • ARM_ENVIRONMENT

这些环境变量的值都可以从前面创建 Azure service principal 的过程中获得。方便起见,我们把设置这些环境变量的步骤可以写到脚本文件 azureEnv.sh 中:

#!/bin/sh
echo "Setting environment variables for Terraform"
export ARM_SUBSCRIPTION_ID=your_subscription_id
export ARM_CLIENT_ID=your_appId
export ARM_CLIENT_SECRET=your_password
export ARM_TENANT_ID=your_tenant_id
# Not needed for public, required for usgovernment, german, china
export ARM_ENVIRONMENT=public

这样在执行 Terraform 命令前通过 source 命令执行该脚本就可以了!

创建 Terraform 配置文件
为了在 Azure 上创建一个 Resource Group,我们创建名称为 createrg.tf 的配置文件,并编辑内容如下:

provider "azurerm" {
}
resource "azurerm_resource_group" "rg" {
        name = "NickResourceGroup"
        location = "eastasia"
}

用 init 命令用来初始化工作目录
把当前目录切换到 createrg.tf 文件所在的目录,然后执行 init 命令:

$ terraform init 

其实就是把 createrg.tf 文件中指定的驱动程序安装到当前目录下的 .terraform 目录中:

通过 plan 命令检查配置文件
plan 命令会检查配置文件并生成执行计划,如果发现配置文件中有错误会直接报错:

$ . azureEnv.sh
$ terraform plan

通过 plan 命令的输出,我们可以清楚的看到即将在目标环境中执行的任务。

使用 graph 命令生成可视化的图表
其实 graph 命令只能生成相关图表的数据(dot 格式的数据),我们通过 dot 命令来生成可视化的图表,先通过下面的命令安装 dot 程序:

$ sudo apt install graphviz

然后生成一个图表:

$ terraform graph | dot -Tsvg > graph.svg

上图描述了我们通过 azurerm 驱动创建了一个 Resource Group。

使用 apply 命令完成部署操作
在使用 apply 命令执行实际的部署时,默认会先执行 plan 命令并进入交互模式等待用户确认操作,我们已经执行过 plan 命令了,所以可以使用 -auto-approve 选项跳过这些步骤直接执行部署操作:

$ terraform apply -auto-approve

到 Azure 站点上检查一下,发现名称为 NickResourceGroup 的 Resource Group 已经创建成功了。

总结

Terraform 支持的平台非常多,像 AWS,Azure 等大厂自然是不用说了,一些小的厂商也可以通过提供 provider 支持 Terraform,从而让整个生态变得非常活跃。如果大家想在 DevOps 实践中引入基础设施即代码,无论是面对的是公有云还是私有云,相信 Terraform 都不会让你失望。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一杯甜酒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值