0%

Terraform-基础架构管理工具

Terraform是一种开源工具,用于安全高效地预览,配置和管理云基础架构和资源。

概览

HashiCorp Terraform 是一个IT基础架构自动化编排工具,可以用代码来管理维护 IT 资源。Terraform的命令行接口(CLI)提供一种简单机制,用于将配置文件部署到阿里云或其他任意支持的云上,并对其进行版本控制。它编写了描述云资源拓扑的配置文件中的基础结构,例如虚拟机、存储帐户和网络接口。

Terraform是一个高度可扩展的工具,通过 Provider 来支持新的基础架构。Terraform能够让您在阿里云上轻松使用 简单模板语言 来定义、预览和部署云基础结构。您可以使用Terraform来创建、修改、删除ECS、VPC、RDS、SLB等多种资源。

阿里云作为国内第一家与 Terraform 集成的云厂商,terraform-provider-alicloud目前已经提供了超过 163 个 Resource 和 113 个 Data Source,覆盖计算,存储,网络,负载均衡,CDN,容器服务,中间件,访问控制,数据库等超过35款产品,已经满足了大量大客户的自动化上云需求。

从 Terraform 0.12.2 版本开始,阿里云支持将对象存储服务 OSS 作为标准的Remote State Backend,开始提供远端存储 State 的能力,在提高 state 安全性的同时,提升多人协作效率。

为了给开发者提供“开箱即用”的使用体验,阿里云提供了丰富多样的ModulesExamples,覆盖计算,存储,网络,中间件,数据库等多个产品和使用场景,欢迎大家使用和贡献自己的Module。

优势

  • 将基础结构部署到多个云

    Terraform适用于多云方案,将类似的基础结构部署到阿里云、其他云提供商或者本地数据中心。开发人员能够使用相同的工具和相似的配置文件同时管理不同云提供商的资源。

  • 自动化管理基础结构

    Terraform能够创建配置文件的模板,以可重复、可预测的方式定义、预配和配置ECS资源,减少因人为因素导致的部署和管理错误。能够多次部署同一模板,创建相同的开发、测试和生产环境。

  • 基础架构即代码(Infrastructure as Code)

    可以用代码来管理维护资源。允许保存基础设施状态,从而使您能够跟踪对系统(基础设施即代码)中不同组件所做的更改,并与其他人共享这些配置 。

  • 降低开发成本

    您通过按需创建开发和部署环境来降低成本。并且,您可以在系统更改之前进行评估。

Terraform可以对基础设施进行编码,利用代码来进行资源的增删查改。

应用场景

创建基础设施

您可以使用Terraform创建和管理ECS、VPC和SLB等基础资源。

创建多台ECS并挂载数据盘,请参见示例模板ecs-instance

均衡负载业务流量

您可以将访问流量按照定义的转发规则分发到指定的后端服务器(ECS实例),提高应用系统对外的服务能力,消除单点故障。

部署负载均衡服务,请参见示例模板ecs-slb

自动伸缩

根据您的业务需求和策略自动调整弹性计算资源,在业务需求增长时无缝增加ECS实例满足计算需要,在业务需求下降时自动减少ECS实例节约成本。

一键创建伸缩组,伸缩配置和伸缩规则相关操作,请参见示例模板autoscalingautoscaling-rule

集群管理

您可以使用Terraform快速创建专有网络的集群。

在阿里云中启动kubernetes集群,并且在集群中创建VPC、交换机和NAT网关等资源,请参见示例模板kubernetes module

配置函数计算服务

阿里云函数计算是事件驱动的全托管计算服务。通过函数计算,您无需管理服务器等基础设施,只需编写代码并上传。借助于函数计算,您可以快速构建任何类型的应用和服务,无需管理和运维。

一键搭建函数服务运行环境,快速配置对象存储、内容分发网络、消息队列、HTTP服务、日志服务等多种触发器,请参见示例模板:fc module

安装和配置

在使用Terraform的简单模板语言定义、预览和部署云基础结构前,您需要安装预配置Terraform。

操作步骤

  1. 登录 Terraform官网 下载适用于您的操作系统的程序包。

  2. 将程序包解压到/usr/local/bin。

    如果将可执行文件解压到其他目录,按照以下方法为其定义全局路径:

  3. 运行terraform验证路径配置。

    命令运行后将显示可用的Terraform选项的列表,如下所示,表示安装完成。

    1
    2
    username:~$ terraform
    Usage: terraform [-version] [-help] <command> [args]
  4. 为提高权限管理的灵活性和安全性,建议您创建RAM用户,并为其授权。

    1. 登录 RAM控制台
    2. 创建名为Terraform的RAM用户,并为该用户创建AccessKey。具体步骤请参见创建RAM用户
    3. 为RAM用户授权。具体步骤请参见为RAM用户授权
  5. 创建环境变量,用于存放身份认证信息。

    1
    2
    3
    export ALICLOUD_ACCESS_KEY="LTAIUrZCw3********"
    export ALICLOUD_SECRET_KEY="zfwwWAMWIAiooj14GQ2*************"
    export ALICLOUD_REGION="cn-beijing"

相关文档

常用命令

Terraform是一个管理IT资源的客户端工具,您可以使用Terraform提供的命令来实现对所有资源的管理。本文将主要围绕资源管理和状态管理两个方面为您介绍涉及到的常用命令。

资源管理常用命令

Terraform对资源的管理主要是对资源生命周期的管理,即通过命令实现对Terraform模板中所定义资源的创建,修改,查看和删除。

  • terraform plan

    :资源的预览

    plan命令用于对模板中所定义资源的预览,主要用于以下几个场景:

    • 预览当前模板中定义的资源是否符合管理预期,和Markdown的预览功能类似。
    • 如果当前模板已经存在对应的state文件,那么plan命令将会展示模板定义与state文件内容的diff结果,如果有变更,会将结果在下方显示出来。
    • 对DataSource而言,执行plan命令,即可直接获取并输出所要查询的资源及其属性。
  • terraform apply

    :资源的新建和变更

    apply命令用于实际资源的新建和变更操作,为了安全起见,在命令运行过程中增加了人工交互的过程,即需要手动确认是否继续,当然也可以通过**–auto-approve**参数来跳过人工确认的过程。

    apply命令适用于以下几种场景:

    • 创建新的资源。
    • 通过修改模板参数来修改资源的属性。
    • 如果从当前模板中删除某个资源的定义,apply命令会将该资源彻底删除。可以理解为“资源的移除也是一种变更”。
  • terraform show

    :资源的展示

    show命令用于展示当前state中所有被管理的资源及其所有属性值。

  • terraform destroy

    :资源的释放

    destroy命令用于对资源的释放操作,为了安全起见,在命令执行过程中,也增加了人工交互的过程,如果想要跳过手动确认操作,可以通过**–force**参数来跳过。

    terraform destroy默认会释放当前模板中定义的所有资源,如果只想释放其中某个特定的资源,可以通过参数-target=<资源类型>.<资源名称>来指定。

  • terraform import

    :资源的导入

    import命令用于将存量的云资源导入到terraform state中,进而加入到Terraform的管理体系中,适用的场景包含但不限于以下几种:

    • 从来没有使用Terraform管控过任何资源,当前所有的存量云资源都是通过控制台,阿里云CLI,ROS或者直接调用API创建和管理的,现在想要切换为Terraform管理。
    • 在不影响资源正常使用的前提下,重构资源模板中的资源定义。
    • 阿里云的Provider进行了兼容性升级,新版Provider对原有模板中所定义的资源支持了更多的参数,需要把最新的参数同步进来。

    说明 有关import如何实现存量资源的管理,请参见如何解决存量云资源的管理难题

  • terraform taint

    :标记资源为

    被污染

    taint命令用于把某个资源标记为被污染状态,当再次执行apply命令时,这个被污染的资源将会被先释放,然后再创建一个新的,相当于对这个特定资源做了先删除后新建的操作。

    命令的详细格式为: terraform taint <资源类型>.<资源名称> ,如:

    1
    2
    $ terraform taint alicloud_vswitch.this
    Resource instance alicloud_vswitch.this has been marked as tainted.
  • terraform untaint

    :取消

    被污染

    标记

    untaint命令是taint的逆向操作,用于取消被污染标记,使其恢复到正常的状态。命令的详细格式和taint类似为:terraform untaint <资源类型>.<资源名称> ,如:

    1
    2
    $ terraform untaint alicloud_vswitch.this
    Resource instance alicloud_vswitch.this has been successfully untainted.
  • terraform output

    :打印出参及其值

    如果在模板中显示定义了output参数,那么这个output的值将在apply命令之后展示,但plan命令并不会展示,如果想随时随地快速查看output的值,可以直接运行命令 terraform output :

    1
    2
    $ terraform output
    vswitchId = vsw-gw8gl31wz********

状态管理常用命令

Terraform对资源状态的管理,实际上是对State文件中数据的管理。State文件保存了当前Terraform管理的所有资源及其属性,内容都是由Terraform自动存储的,为了保证数据的完整性,不建议手动修改State内容。对State数据的操作可以通过terraform state命令来完成。

  • terraform state list:列出当前state中的所有资源

    state list命令会按照 <资源类型>.<资源名称> 的格式列出当前state中存在的所有资源(包括datasource),例如:

    1
    2
    3
    4
    $ terraform state list
    data.alicloud_slbs.default
    alicloud_vpc.default
    alicloud_vswitch.this
  • terraform state show:展示某一个资源的属性

    state show命令按照Key-Value的格式展示出特定资源的所有属性及其值,命令的完整格式为 terraformstate show <资源类型>.<资源名称> ,例如:

    1
    2
    3
    4
    5
    6
    7
    8
    $ terraform state show alicloud_vswitch.this
    # alicloud_vswitch.this:
    resource "alicloud_vswitch" "this" {
    availability_zone = "eu-central-1a"
    cidr_block = "172.16.0.0/24"
    id = "vsw-gw8gl31wz******"
    vpc_id = "vpc-gw8calnzt*******"
    }
  • terraform state pull:获取当前state内容并展示

    state pull命令用于原样展示当前state文件数据,类似与Shell下的cat命令,例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    $ terraform state pull
    {
    "version": 4,
    "terraform_version": "0.12.8",
    "serial": 615,
    "lineage": "39aeeee2-b3bd-8130-c897-2cb8595cf8ec",
    "outputs": {
    ***
    }
    },
    "resources": [
    {
    "mode": "data",
    "type": "alicloud_slbs",
    "name": "default",
    "provider": "provider.alicloud",
    ***
    },
    {
    "mode": "managed",
    "type": "alicloud_vpc",
    "name": "default",
    "provider": "provider.alicloud",
    ***
    }
    ]
    }
  • terraform state rm:移除特定的资源

    state rm命令用于将state中的某个资源移除,但是实际上并不会真正删除这个资源,命令格式为:terraformstate rm <资源类型>.<资源名称> ,例如:

    1
    2
    3
    $ terraform state rm alicloud_vswitch.this
    Removed alicloud_vswitch.this
    Successfully removed 1 resource instance(s).

    移除后,如果模板内容不变并且再次执行apply命令,将会新增一个同样的资源。移除后的资源可以再次通过import命令再次加入。

  • terraform state mv:变更特定资源的存放地址

    如果想调整某个资源所在的state文件,可以通过state mv命令来完成,类似于Shell下的mv命令,这个命令的使用有多种选项,可以通过命令 terraform state mv –help 来详细了解。本文只介绍最常用的一种:terraform state mv --state=./terraform.tfstate --state-out=<target path>/terraform-target.tfstate <资源类型>.<资源名称A> <资源类型>.<资源名称B> ,如:

    1
    2
    3
    $ terraform state mv --state-out=../tf.tfstate alicloud_vswitch.this alicloud_vswitch.default
    Move "alicloud_vswitch.this" to "alicloud_vswitch.default"
    Successfully moved 1 object(s)

    如上命令省略了默认的--state=./terraform.tfstate选项,命令最终的结果是将当前State中的VSwitch资源移动到了上层目录下名为 tf.tfstate 的State中,并且将VSwitch的资源名称由“this”改为了“default”。

  • terraform refresh:刷新当前state

    refresh命令可以用来刷新当前State的内容,即再次调用API并拉取最新的数据写入到state文件中。

其他常用命令

除了资源和状态的管理命令外,还有一些常用的应用在模板,Provider等多种场景下的命令。

  • terraform init:初始化加载模块

    init用来初始化加载所需的模块,包括Provider,Provisioner,Module等。

  • terraform graph:输出当前模板定义的资源关系图

    每个模板定义的资源之间都存在不同程度的关系,如果想看资源关系图,可以使用命令terraform graph:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ terraform graph
    digraph {
    compound = "true"
    newrank = "true"
    subgraph "root" {
    "[root] alicloud_vpc.default" [label = "alicloud_vpc.default", shape = "box"]
    "[root] alicloud_vswitch.this" [label = "alicloud_vswitch.this", shape = "box"]
    ******
    "[root] output.vswitchId" -> "[root] alicloud_vswitch.this"
    "[root] provider.alicloud (close)" -> "[root] alicloud_vswitch.this"
    ******
    "[root] root" -> "[root] provider.alicloud (close)"
    }
    }

    该命令的结果还可以通过命令terraform graph | dot -Tsvg > graph.svg直接导出为一张图片(需要提前安装graphviz: brew install graphviz ):graph_img

  • terraform validate:验证模板语法是否正确

    Terraform模板的编写需要遵循其自身定义的一套简单的语法规范,编写完成后,如果想要检查模板是否存在语法错误或者在运行planapply命令的时候报语法错误,可以通过执行命令terraform validate来检查和定位错误出现的详细位置和原因。

Providers

https://registry.terraform.io/browse/providers

Terraform-provider-alicloud

github地址