云服务可谓是基础架构即代码 IaC (Infrastructure as Code)的最佳实践,经过代码来定义计算和网络基础设施,完成客户所需。但是,你真的了解 IaC 吗?若是一个公司采用基础设施即代码的方式的话,他有什么样的风险?mysql
本文将经过如下五点为您详细讲解:git
什么是 Terraformsql
Terraform 是一个安全、高效地部署、更改、版本化基础设施和应用程序的工具,能够用来管理多层次的资源。从上层的软件配置到底层的网络、系统配置均可以使用 Terraform 统一进行管理。docker
Terraform 用配置文件来描述一个应用。Terraform 会将配置文件与当前环境对比后,生成一个执行计划,这个计划会列出为了达到配置文件中定义的状态所须要执行的操做,而后执行计划以达到指望的状态。数据库
Terraform 经过插件机制管理不一样的资源提供者,以此来接入各类资源,如虚拟机,存储,网络和各类应用服务。编程
Infrastructure as Code后端
将基础架构使用配置语法进行描述,这可让数据中心的构建计划能够像其余代码同样进行版本化和追踪。浏览器
Execution Plans安全
Terraform有一个规划步骤,它生成一个执行计划。执行计划显示当您调用应用程序时 Terraform 将执行的操做。使用这个功能能够保证操做基础设施时不发生意外服务器
Resource Graph
Terraform 建立了一个全部资源的视图。这使得 Terraform 能够并行化没有依赖的建立与修改。
所以,Terraform 能够高效地构建基础架构。操做人员也能更加了解环境的结构。
Change Automation
Terraform 会自动的分析什么是须要修改的,从而避免了许多可能的人为错误。
与 Terraform 相似的 Infrastructure as Code 工具大概有下面几种:
下面将从几个方面来讲明 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 来配置基础架构,所以除了您已经使用云提供商以外,没有新的身份验证机制,而且不须要直接访问您的服务器。
比较表格
应用场景 1
某应用使用了 Loadbalancer 进行 Instance 间的流量均衡处理,以增大吞吐率、扩大并发数、缩短延迟。
操做步骤:新建安全组、添加安全组规则、申请弹性公网 IP、建立负载均衡器、建立 Instance、在负载均衡器中添加负载均衡器监听器、配置会话保持、添加健康检查、在负载均衡器监听器中添加后端……
应用场景 2
某应用须要隔离的网络环境,须要将应用搭建在 VPC 网络当中,架构以下:
操做步骤:
建立安全组、配置安全组、申请弹性公网 IP、建立 VPC、建立 vxnet、建立负载均衡器、配置负载均衡器、建立 Instance 等配置操做。
应用场景 3
随着业务调整和业务量增大,须要增长更多的节点和集群以承载更多的请求,此时须要对已有的资源进行扩容:
应用场景 4
随着应用的不断迭代,应用部署和发布的成本也在增长,如何实现应用的快速部署和发布:
上述场景的共性:
针对场景1、二:建立基础设施
使用 Terraform,咱们能够对基础设施进行编码,利用代码来进行资源的增删查改。
针对场景3、四:扩容和部署
修改资源代码以改变基础设施,并利用 privisioner 帮助运行部署脚本,完成扩容和部署。
快速和安全
利用代码进行建立资源的速度能够是人工点击的几倍甚至几十倍。
任何人均可以随时创建起一个环境
只要拥有基础设施代码的访问权限,就能够本身完成环境的建立,而不须要其余团队的帮助。
避免雪花服务器
人工配置环境可能会致使出现雪花服务器,而使用 Terraform 自动配置则不容易出现。
全部的环境使用相似的代码
使用 Terraform 你能够轻松的控制副本的数量,方便建立一个小的开发/测试环境,或者一个大的生产环境。
像对待应用代码同样对待基础设施
方便不断的改进基础设施的代码。享受版本管理工具的历史查看、回滚、备份存储等功能。
在部署以前验证架构
对基础设施代码作静态分析,能够大大下降出错的可能性。
追踪基础设施的变化。
若是在部署当中发生了错误,能够快速恢复到上一个版本,审计人员也能够经过历史记录进行审计。
快乐
这是一个很是重要可是常常被忽视的优势。手动部署代码和管理基础架构是重复和乏味的。开发人员和系统管理员对这种工做感到不满,由于它不涉及创造力,没有挑战,也没有承认。
除非你部署失败了,否则没有人会关注你。
这形成了一个压力和不愉快的环境。Terraform 提供了一个更好的选择,容许计算机作他们最擅长的(自动化执行)和开发人员来作他们最擅长的(编码)。
1.Terraform 及 terraform-provider-qingcloud 安装
安装 Terraform
咱们首先安装 Terraform,咱们须要进到 Terraform 的官网找到适合的软件包进行下载。
下载 Terraform 后,解压压缩包。压缩包中有一个名为 Terraform 的文件,咱们只须要这个二进制文件就可使用 Terraform 了。
最后一步是设置 Terraform 的 PATH。如何在 Linux 和 Mac 中设置 PATH 能够参考这个页面, 如何在 Windows 当中设置 PATH 能够参考这个页面。
验证 Terraform 安装
在安装完 Terraform 以后,咱们能够打开一个新的终端来验证 Terraform 安装成功了。
执行 terraform -v 能够看到相似下面的输出:
安装 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 会建立实际的资源,可能会产生一些费用。
理解配置文件
Terraform 全部的配置文件以 tf 做为后缀名。在执行相关命令时,Terraform 会自动加载当前目录下的 *.tf 文件。
Terraform 的配置文件是 HashiCorp 公司的 HCL 语言。
Terraform init
与 git 相似,咱们须要在 Terraform 项目的根目录运行 terraform init 去初始化项目。
在初始化项目的时候,Terraform 会解析目录下的*.tf文件并加载相关的 provider 插件。在 wordpress 文件夹下运行 terraform init 会看到相似下面的输出:
验证 Terraform init
在 wordpress 文件夹下运行 terraform -v 会获得相似下面的输出:
指定 Provider
在 ./provider.tf 文件咱们指定了 Provider,QingCloud 的 Provider 须要 access_key 与 secret_key 进行调用 API,key 能够在 QingCloud Web 控制台进行申请。
zone 指定了资源会在哪一个区中进行建立,默认为 Pek3a 区。
理解 Resource
HCL 语言是一种声明式语言,即在 *.tf 文件中声明了咱们所指望的资源状态。
咱们在 ./modules/qingcloud/qingcloud.tf 文件当中指定了咱们想要的资源以及他们的状态。
在定义的资源的时候咱们能够在一个资源当中引用其余资源的字段,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 做为私钥进行了远程链接,若是须要修改的话请自行修改配置文件。
在整个例子的源码当中,咱们分别建立了下列资源:
若是须要获取更多有关 terraform 基本操做的信息,能够参考官方文档的 Getting Started 部分。
获取更多资源的使用信息,能够查看 terraform-qingcloud-provider 的文档
利用 Built-in Functions 避免手工操做
在建立 resource qingcloud_keypair 的时候,咱们使用了 Terraform 的内置函数去帮助获取文件 ~/.ssh/id_rsa.pub 的内容。从而避免了咱们手工复制粘贴。
Terraform 内置了许多函数帮助用户解决一些常见操做,若是须要获取更多的信息,请参考官方文档。
使用 Provisioners 进行环境配置
Provisioners 能够在资源建立/销毁时在本地/远程执行脚本。
Provisioners 一般用来引导一个资源,在销毁资源前完成清理工做,进行配置管理等。
Provisioners 拥有多种类型能够知足多种需求,如:文件传输(file),本地执行(local-exec),远程执行(remote-exec)等 Provisioners 能够添加在任何的 resource 当中:
在 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 会获得相似下面的结果:
使用 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:
填写 provider.tf 中的 access_key 与 secret_key 后,咱们使用 terraform apply 能够完成资源的建立与配置。
注意:在 example 中是根据文件来获取 SSH key,在您机器上可能不存在此文件,请您自行建立 SSH key。
咱们会在输出的结尾获取到相似下图的输出:
打开浏览器,输入 output的IP,能够看到 wordpress 已经正常运行:
多层应用的部署
通常来说应用都是分为 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 能够一键的进行资源的建立与删除,这能够帮助咱们快速的建立测试环境,完成使用后能够进行及时的删除。