在 DevOps 实践中,基础设施即代码如何落地是一个绕不开的话题。像 Chef,Puppet 等成熟的配置管理工具,都可以知足必定程度的需求,但有没有更友好的工具可以知足咱们绝大多数的需求?笔者认为 Terraform 是一个颇有潜力的工具,目前各大云平台也都支持的不错,尤为是使用起来简单明了。本文会简单的介绍一下 Terraform 相关的概念,而后经过一个小 demo 带你们一块儿进入 Terraform 的世界。说明:本文的演示环境为 ubuntu 16.04。html
Terraform 是一种安全有效地构建、更改和版本控制基础设施的工具(基础架构自动化的编排工具)。它的目标是 "Write, Plan, and create Infrastructure as Code", 基础架构即代码。Terraform 几乎能够支持全部市面上能见到的云服务。具体的说就是能够用代码来管理维护 IT 资源,把以前须要手动操做的一部分任务经过程序来自动化的完成,这样的作的结果很是明显:高效、不易出错。linux
Terraform 提供了对资源和提供者的灵活抽象。该模型容许表示从物理硬件、虚拟机和容器到电子邮件和 DNS 提供者的全部内容。因为这种灵活性,Terraform 能够用来解决许多不一样的问题。这意味着有许多现有的工具与Terraform 的功能重叠。可是须要注意的是,Terraform 与其余系统并不相互排斥。它能够用于管理小到单个应用程序或达到整个数据中心的不一样对象。git
Terraform 使用配置文件描述管理的组件(小到单个应用程序,达到整个数据中心)。Terraform 生成一个执行计划,描述它将作什么来达到所需的状态,而后执行它来构建所描述的基础结构。随着配置的变化,Terraform 可以肯定发生了什么变化,并建立可应用的增量执行计划。github
Terraform 是用 Go 语言开发的开源项目,你能够在 github 上访问到它的源代码。json
基础架构即代码(Infrastructure as Code)
使用高级配置语法来描述基础架构,这样就能够对数据中心的蓝图进行版本控制,就像对待其余代码同样对待它。ubuntu
执行计划(Execution Plans)
Terraform 有一个 plan 步骤,它生成一个执行计划。执行计划显示了当执行 apply 命令时 Terraform 将作什么。经过 plan 进行提早检查,可使 Terraform 操做真正的基础结构时避免意外。安全
资源图(Resource Graph)
Terraform 构建的全部资源的图表,它可以并行地建立和修改任何没有相互依赖的资源。所以,Terraform 能够高效地构建基础设施,操做人员也能够经过图表深刻地解其基础设施中的依赖关系。架构
自动化变动(Change Automation)
把复杂的变动集应用到基础设施中,而无需人工交互。经过前面提到的执行计划和资源图,咱们能够确切地知道 Terraform 将会改变什么,以什么顺序改变,从而避免许多可能的人为错误。app
Terraform 的安装很是简单,直接把官方提供的二进制可执行文件保存到本地就能够了。好比笔者习惯性的把它保存到 /usr/local/bin/ 目录下,固然这个目录会被添加到 PATH 环境变量中。完成后检查一下版本号:ide
经过 -h 选项咱们能够看到 terraform 支持的全部命令:
要让 Terraform 访问 Azure 订阅中的资源,须要先建立 Azure service principal,Azure service principa 容许你的 Terraform 脚本在 Azure 订阅中配置资源。请参考这里建立 Azure service principal。
配置 Terraform 环境变量
若要配置 Terraform 使用 Azure service principal,须要设置如下环境变量:
这些环境变量的值均可以从前面建立 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 都不会让你失望。
参考:
Introduction to Terraform
Terraform github
安装和配置 Terraform