IaC 自动化配置与编排神器 - Terraform 深度解析

云服务可谓是基础架构即代码 IaC (Infrastructure as Code)的最佳实践,经过代码来定义计算和网络基础设施,完成客户所需。但是,你真的了解 IaC 吗?若是一个公司采用基础设施即代码的方式的话,他有什么样的风险?mysql


本文将经过如下五点为您详细讲解:git

  • 什么是 IaC(Infrastructure as Code),他与 DevOps 之间的关系是什么?
  • 什么是 Terraform?
  • Terraform 的主要特性;
  • Terraform vs Other Software;
  • Terraform 的使用场景。


Terraform - Infrastructure as Code

什么是 Terraformsql

Terraform 是一个安全、高效地部署、更改、版本化基础设施和应用程序的工具,能够用来管理多层次的资源。从上层的软件配置到底层的网络、系统配置均可以使用 Terraform 统一进行管理。docker

Terraform 用配置文件来描述一个应用。Terraform 会将配置文件与当前环境对比后,生成一个执行计划,这个计划会列出为了达到配置文件中定义的状态所须要执行的操做,而后执行计划以达到指望的状态。数据库

Terraform 经过插件机制管理不一样的资源提供者,以此来接入各类资源,如虚拟机,存储,网络和各类应用服务。编程

Terraform 的主要特性

Infrastructure as Code后端

将基础架构使用配置语法进行描述,这可让数据中心的构建计划能够像其余代码同样进行版本化和追踪。浏览器

Execution Plans安全

Terraform有一个规划步骤,它生成一个执行计划。执行计划显示当您调用应用程序时 Terraform 将执行的操做。使用这个功能能够保证操做基础设施时不发生意外服务器

Resource Graph

Terraform 建立了一个全部资源的视图。这使得 Terraform 能够并行化没有依赖的建立与修改。

所以,Terraform 能够高效地构建基础架构。操做人员也能更加了解环境的结构。

Change Automation

Terraform 会自动的分析什么是须要修改的,从而避免了许多可能的人为错误。

Terraform vs. Other Software

与 Terraform 相似的 Infrastructure as Code 工具大概有下面几种:

  • Chef
  • Puppet
  • Ansible
  • SaltStack
  • CloudFormation

下面将从几个方面来讲明 Terraform 与其余工具对比的优点。

配置管理工具与编排工具

Chef、Puppet、Ansible、SaltStack 均可以称为配置管理工具,这些工具的主要目标是在已经存在的机器上安装和管理软件。

而 Terraform 和 CloudFormation 能够称为编排工具,更注重于数据中心以及相关服务的高级抽象。他们的工做重点是建立资源而且引导进行初始化。

并且在如今的环境下,你们使用容器等服务,镜像已经包括了软件的安装与配置。一旦你有了镜像,你须要的是一些服务器去运行它。

对于提供服务器这种需求,编排工具会比配置管理工具更适合作此类工做。

编程式语言与声明式语言

Chef 和 Ansible 但愿你去一步步编写程序以达到最终所指望的状态。

Terraform、CloudFormation、SaltStack、Puppet 但愿你去声明最终想要的资源与资源的状态,工具自己会自动分析达到想要的状态须要进行怎样的操做。

在使用编程式语言时,工具不会获取历史的状态,因此咱们须要考虑的更多以达到与以前版本的兼容。

而且使用编程式语言会致使代码库变得愈来愈庞大,不利于人们理解与代码的复用。不过声明式的语言的表达能力是较为欠缺的,例如咱们须要基础设施的滚动升级时,声明式的语言是很难知足要求的。

为此 Terraform 提供了一些基础服务,例如输入变量,输出变量,在销毁以前建立等。

客户端服务器架构与客户端架构

Chef、Puppet、SaltStack 在默认状况下都使用了客户端服务器架构。客户端(多是 Web UI 或 CLI 工具)是用来发出命令(例如「deploy X」)的东西。

这些命令到达一个服务器,它负责执行你的命令并存储系统的状态。要执行这些命令,服务器会与 agent 进行通讯,agent 必须在要配置的每一个服务器上运行,这有几个缺点:

  • 您必须在每台服务器上安装并运行额外的软件。
  • 为了配置管理,您必须部署额外的服务器(甚至是一组服务器以实现高可用性)。
  • 因为客户端,服务器和代理都须要经过网络进行通讯,所以您必须为其打开额外的端口,并配置相互验证。
  • 这些配置会引入大量不一样类型的故障,当收到错误警告时,必需要弄清楚是哪一部分出现了故障。

CloudFormation 也是客户端/服务器架构,但 AWS 透明地处理全部的服务器细节,做为最终用户,您只须要考虑客户端代码。Ansible 客户端则经过 SSH 直接链接到您的服务器。

Terraform 使用云提供商 API 来配置基础架构,所以除了您已经使用云提供商以外,没有新的身份验证机制,而且不须要直接访问您的服务器。


IaC 自动化配置与编排神器 - Terraform 深度解析

比较表格



Terraform 的应用场景

应用场景 1

某应用使用了 Loadbalancer 进行 Instance 间的流量均衡处理,以增大吞吐率、扩大并发数、缩短延迟。

IaC 自动化配置与编排神器 - Terraform 深度解析

操做步骤:新建安全组、添加安全组规则、申请弹性公网 IP、建立负载均衡器、建立 Instance、在负载均衡器中添加负载均衡器监听器、配置会话保持、添加健康检查、在负载均衡器监听器中添加后端……

应用场景 2

某应用须要隔离的网络环境,须要将应用搭建在 VPC 网络当中,架构以下:

IaC 自动化配置与编排神器 - Terraform 深度解析

操做步骤:

建立安全组、配置安全组、申请弹性公网 IP、建立 VPC、建立 vxnet、建立负载均衡器、配置负载均衡器、建立 Instance 等配置操做。

应用场景 3

随着业务调整和业务量增大,须要增长更多的节点和集群以承载更多的请求,此时须要对已有的资源进行扩容:

IaC 自动化配置与编排神器 - Terraform 深度解析

应用场景 4

随着应用的不断迭代,应用部署和发布的成本也在增长,如何实现应用的快速部署和发布:

IaC 自动化配置与编排神器 - Terraform 深度解析

上述场景的共性:

  • 操做流程配置固定;
  • 手工操做效率低、时间长;
  • 手工操做可能致使错误;
  • 手工操做过程没有历史记录;
  • 手工操做过程不能审计;
  • 手工操做随着业务的复杂而不断增大。

使用 Terraform 自动化一切

针对场景1、二:建立基础设施


IaC 自动化配置与编排神器 - Terraform 深度解析


使用 Terraform,咱们能够对基础设施进行编码,利用代码来进行资源的增删查改。

针对场景3、四:扩容和部署

IaC 自动化配置与编排神器 - Terraform 深度解析


修改资源代码以改变基础设施,并利用 privisioner 帮助运行部署脚本,完成扩容和部署。

使用 Terraform 的优势


快速和安全

利用代码进行建立资源的速度能够是人工点击的几倍甚至几十倍。

任何人均可以随时创建起一个环境

只要拥有基础设施代码的访问权限,就能够本身完成环境的建立,而不须要其余团队的帮助。

避免雪花服务器

人工配置环境可能会致使出现雪花服务器,而使用 Terraform 自动配置则不容易出现。

全部的环境使用相似的代码

使用 Terraform 你能够轻松的控制副本的数量,方便建立一个小的开发/测试环境,或者一个大的生产环境。

像对待应用代码同样对待基础设施

方便不断的改进基础设施的代码。享受版本管理工具的历史查看、回滚、备份存储等功能。

在部署以前验证架构

对基础设施代码作静态分析,能够大大下降出错的可能性。

追踪基础设施的变化。

若是在部署当中发生了错误,能够快速恢复到上一个版本,审计人员也能够经过历史记录进行审计。

快乐

这是一个很是重要可是常常被忽视的优势。手动部署代码和管理基础架构是重复和乏味的。开发人员和系统管理员对这种工做感到不满,由于它不涉及创造力,没有挑战,也没有承认。

除非你部署失败了,否则没有人会关注你。

这形成了一个压力和不愉快的环境。Terraform 提供了一个更好的选择,容许计算机作他们最擅长的(自动化执行)和开发人员来作他们最擅长的(编码)。

Terraform-QingCloud 使用

1.Terraform 及 terraform-provider-qingcloud 安装

安装 Terraform

咱们首先安装 Terraform,咱们须要进到 Terraform 的官网找到适合的软件包进行下载。

下载 Terraform 后,解压压缩包。压缩包中有一个名为 Terraform 的文件,咱们只须要这个二进制文件就可使用 Terraform 了。

最后一步是设置 Terraform 的 PATH。如何在 Linux 和 Mac 中设置 PATH 能够参考这个页面, 如何在 Windows 当中设置 PATH 能够参考这个页面。

验证 Terraform 安装

在安装完 Terraform 以后,咱们能够打开一个新的终端来验证 Terraform 安装成功了。

执行 terraform -v 能够看到相似下面的输出:

IaC 自动化配置与编排神器 - Terraform 深度解析


安装 terraform-provider-qingcloud

terraform-provider-qingcloud 一样是以二进制文件进行发布,咱们能够到 Github 上找到适合的软件包进行下载。

下载并解压之后会有一个二进制文件。

在 Linux 以及 Mac 当中咱们须要将这个二进制文件放到 ~/.terraform.d/plugins/ 当中。在 Windows 当中把这个二进制文件放到用户的「Application Data」目录下的 terraform.d/plugins/ 当中。

2.Terraform 使用-以 wordpress 为例

下面咱们以 wordpress 为例演示如何使用 Terraform 在青云中从零开始部署一整套环境。部署下图中所示的基础设施及软件资源。

例子源码请单击「阅读原文」查看。

注意:使用 terraform apply 会建立实际的资源,可能会产生一些费用。

IaC 自动化配置与编排神器 - Terraform 深度解析


理解配置文件

Terraform 全部的配置文件以 tf 做为后缀名。在执行相关命令时,Terraform 会自动加载当前目录下的 *.tf 文件。

Terraform 的配置文件是 HashiCorp 公司的 HCL 语言。

Terraform init

与 git 相似,咱们须要在 Terraform 项目的根目录运行 terraform init 去初始化项目。

在初始化项目的时候,Terraform 会解析目录下的*.tf文件并加载相关的 provider 插件。在 wordpress 文件夹下运行 terraform init 会看到相似下面的输出:


IaC 自动化配置与编排神器 - Terraform 深度解析


验证 Terraform init

在 wordpress 文件夹下运行 terraform -v 会获得相似下面的输出:

IaC 自动化配置与编排神器 - Terraform 深度解析


指定 Provider

在 ./provider.tf 文件咱们指定了 Provider,QingCloud 的 Provider 须要 access_key 与 secret_key 进行调用 API,key 能够在 QingCloud Web 控制台进行申请。

zone 指定了资源会在哪一个区中进行建立,默认为 Pek3a 区。


理解 Resource

HCL 语言是一种声明式语言,即在 *.tf 文件中声明了咱们所指望的资源状态。

咱们在 ./modules/qingcloud/qingcloud.tf 文件当中指定了咱们想要的资源以及他们的状态。

在定义的资源的时候咱们能够在一个资源当中引用其余资源的字段,Terraform 会自动解析这些引用而且按顺序进行建立。

IaC 自动化配置与编排神器 - Terraform 深度解析


在上面的这一小段代码当中,qingcloud_security_group_rule 为资源的名称,须要 Provider 支持特定的资源。

ssh-wordpress-in 为资源的别名,是在这个项目当中惟一的。

上面咱们建立了一个类型为 qingcloud_security_group_rule 的资源,也就是一个防火墙规则资源。

在这个资源中咱们指定了防火墙的 ID,以及规则的协议、优先级、动做、方向以及端口范围。

注意:在建立资源 qingcloud_keypair.foo 的时候咱们是上传用户的 >~/.ssh/id_rsa.pub 文件,

这个公钥须要用户本身去生成,具体生成方法能够参考文档 一样咱们在使用 provisioner 安装软件环境时使用了 ~/.ssh/id_rsa 做为私钥进行了远程链接,若是须要修改的话请自行修改配置文件。

在整个例子的源码当中,咱们分别建立了下列资源:

  • qingcloud_eip.foo:建立一个带宽为 2 的弹性公网 IP
  • qingcloud_keypair.foo:使用 ~/.ssh/id_rsa.pub 的文件内容建立一个 SSH key
  • qingcloud_security_group.foo:建立一个名称为 first_sg 的防火墙
  • qingcloud_security_group_rule.http-in:为防火墙添加一条接收 80 端口 TCP 请求的规则
  • qingcloud_security_group_rule.ssh-wordpress-in:为防火墙添加一条接收 22 端口 TCP 请求的规则
  • qingcloud_security_group_rule.ssh-mysql-in:为防火墙添加一条接收 2222 端口 TCP 请求的规则
  • qingcloud_vpc.foo:建立一个 VPC 网络,而且绑定了防火墙与弹性公网 IP,VPC 的子网范围为 192.168.0.0/16
  • qingcloud_vxnet:建立一个受管的 vxnet,而且加入 VPC 当中,子网范围是 192.168.0.0/24
  • qingcloud_instance.wordpress:建立一个实例,绑定了上面建立的SSH key,而且加入到了vxnet当中
  • qingcloud_instance.mysql:建立一个实例,绑定了上面建立的SSH key,而且加入到了vxnet当中
  • qingcloud_vpc_static.http-portforward:为 VPC 添加一条端口转发规则,将 80 端口的请求转发到 instance 的 80 端口当中
  • qingcloud_vpc_static.ssh-wordpress:为 VPC 添加一条端口转发规则,将 22 端口的请求转发到 qingcloud_instance.wordpress 的 22 端口当中
  • qingcloudvpcstatic.ssh-mysql:为 VPC 添加一条端口转发规则,将 2222 端口的请求转发到 qingcloud_instance.mysql 的 22 端口当中

若是须要获取更多有关 terraform 基本操做的信息,能够参考官方文档的 Getting Started 部分。

获取更多资源的使用信息,能够查看 terraform-qingcloud-provider 的文档

利用 Built-in Functions 避免手工操做

在建立 resource qingcloud_keypair 的时候,咱们使用了 Terraform 的内置函数去帮助获取文件 ~/.ssh/id_rsa.pub 的内容。从而避免了咱们手工复制粘贴。

IaC 自动化配置与编排神器 - Terraform 深度解析


Terraform 内置了许多函数帮助用户解决一些常见操做,若是须要获取更多的信息,请参考官方文档。

使用 Provisioners 进行环境配置

Provisioners 能够在资源建立/销毁时在本地/远程执行脚本。

Provisioners 一般用来引导一个资源,在销毁资源前完成清理工做,进行配置管理等。

Provisioners 拥有多种类型能够知足多种需求,如:文件传输(file),本地执行(local-exec),远程执行(remote-exec)等 Provisioners 能够添加在任何的 resource 当中:


IaC 自动化配置与编排神器 - Terraform 深度解析


在 example 当中,咱们使用了 null_resource 和 provisioner 完成了 qingcloud_instance 上安装 docker 并启动 wordpress 与 mysql。在 null_resource.run_docker_wordpress 当中,咱们指定了 depends_on 参数,保证了在 mysql 已经启动成功后再启动 wordpress。

执行 Terraform plan 查看 Terraform 计划

Terraform plan 命令用于输出执行计划。除非明确禁用,Terraform 会调用 refresh 方法从新查询当前资源的状态。

完成状态刷新后,Terraform 会自动分析要进行的操做以达到配置文件中所须要的状态,并把分析的结果输出出来。在 vpc_one_instance 文件夹下执行 Terraform plan 会获得相似下面的结果:

IaC 自动化配置与编排神器 - Terraform 深度解析



使用 module 进行代码的组织管理

Terraform 中的模块是以组的形式管理不一样的 Terraform 配置。模块用于在 Terraform 中建立可重用组件,以及用于基本代码组织。每个 module 均可以定义本身的 input 与 output,方便代码进行模块化组织。

在例子当中咱们将配置文件分红了两个 module 进行处理:module qingcloud 负责在qingcloud 建立所须要的基础设施资源。module wordpress 负责在建立好的虚机当中安装 docker 而且启动 wordpress 与 mysql。

其中须要安装 wordpress 的机器信息是经过 input 传入进来的,而传入进来的 input 其实是 module qingcloud的output。经过 input 与 output,咱们将两个模块链接到了一块儿。在 ./module.tf 当中,咱们调用了两个 module 指定了两个 module 的参数传递关系。

使用 Terraform apply 提交资源建立及配置

Terraform apply 命令用于应用所需的更改以达到所需的配置状态。为了更加方便的获得咱们所关注的输出结果,可使用 output 单独输出部分字段。如在 ./module.tf 当中,咱们单独获取了 module.wordpress 的 public_ip:

IaC 自动化配置与编排神器 - Terraform 深度解析

填写 provider.tf 中的 access_key 与 secret_key 后,咱们使用 terraform apply 能够完成资源的建立与配置。

注意:在 example 中是根据文件来获取 SSH key,在您机器上可能不存在此文件,请您自行建立 SSH key。

咱们会在输出的结尾获取到相似下图的输出:

打开浏览器,输入 output的IP,能够看到 wordpress 已经正常运行:


IaC 自动化配置与编排神器 - Terraform 深度解析

总结

多层应用的部署

通常来说应用都是分为 N 层架构的,而咱们的例子是一个很是典型的二层应用,分别是业务逻辑层的 wordpress 和数据层的 mysql。

Terraform 确保数据库层在 Web 服务器启动前可用。这得益于 Terraform 能够自动的去解析资源之间的关系,保证了有依赖关系的各层能够按顺序进行建立。

多云环境的部署

人们一般将基础架构分布在多个云中以提升容错性。经过仅使用单个区域或云提供商,容错受限于该提供商的可用性。进行多云部署能够更好地恢复地区或整个提供商的损失。

Terraform 是与云无关的,咱们可使用不一样的 provider 实现多云环境的部署。而且能够将一个项目拆分为多个 module 实现代码的复用。

前面的例子当中,咱们分为了两个 module,其中 module wordpress 是不依赖于云环境的 module,咱们能够在不一样云提供商中复用这个 module。

在同一个项目中一样可使用多个提供者,甚至还能处理多个云当中的依赖关系。这能够帮助用户建立大型的云基础架构。

软件定义网络的配置

软件定义网络(SDN)在数据中心中愈来愈流行,它为用户提供了更多的控制权,同时也带来了人为管理负担。通常来说 SDN 分为控制层与转发层。

Terraform 能够编写 SDN 的配置文件,这些配置能够由 Terraform 自动调用控制层的接口生效。这些配置文件是能够进行版本化的。

例如,QingCloud VPC 是一种很是典型的 SDN,这种资源咱们是能够利用 Terraform 进行管理,完成控制层的配置。

一次性测试环境

使用 Terraform 测试环境是能够被编码的,这些配置文件能够在 QA、开发等团队中进行分享,能够极大减小开发测试团队重复准备环境的负担,减小人为错误,提升工做效率。

而且 Terraform 能够一键的进行资源的建立与删除,这能够帮助咱们快速的建立测试环境,完成使用后能够进行及时的删除。



7 月 25 日, 秉承科技前沿与企业实践并重的 CIC 大会再度来袭,为你们奉上一场科技盛宴。依旧硬核依旧信息过载,干货满满,绝对让你不枉此行。长按识别下面二维码或点击此处,即刻报名!