Terraform 快速开始


一、Terraform 快速开始

1.1 Terraform 是什么?

Terraform 是 HashiCorp 公司开发的产品,支持在多个云平台实现基础设施编排的开源的基础设施即代码(IaC)工具

1.1.1 基本工作原理

  1. 技术人员编写 HCL 代码文件(Hashicorp Configuration Language)

  2. terraform 命令执行时,引擎读取分析代码文件,生成由 resourcedata 组成的图(Graph)

  3. 通过 rpc 调用 data 与 resource 所对应的 Provider 插件

  4. Provider 插件编写者需按照 “Terraform 制定的插件框架” 定义各种 data 和 resource 以及 CRUD 方法,CRUD 方法中完成对目标平台的操作(SDK、HTTP(S) API)

简单画个图,方便理解

terraform 基本工作原理

1.2 Terraform 安装

1.2.1 下载

Terraform 下载页

$ mkdir -p /usr/local/terraform
$ unzip terraform_1.3.7_linux_amd64.zip -d /usr/local/terraform/

由于是 Go 写的,所以直接解压到 PATH 路径下就完事儿

$ terraform -v
Terraform v1.3.7
on linux_amd64

1.2.1 配置缓存路径

Linux 文件名为 .terraformrc

配置开启插件缓存,默认 terraform 会把依赖的插件(provider)下载到本地隐藏目录,为了避免重复下载,配置为集中存方至统一缓存目录

$ vi ~/.terraformrc
plugin_cache_dir   = "$HOME/.terraform.d/plugin-cache"

windows 文件名为 terraform.rc

$ vim %APPDATA%\\terraform.rc
plugin_cache_dir   = "%APPDATA%\\terraform.d\\plugin-cache"

还可以使用 环境变量 设置插件缓存目录

$ export TF_PLUGIN_CACHE_DIR="$HOME/.terraform.d/plugin-cache"

1.2.3 阿里云创建用户/授权

基本照着这个文档配置就行

阿里云 Terraform 文档:https://help.aliyun.com/product/95817.html

阿里云 Terraform 集成:https://github.com/aliyun/terraform-provider-alicloud

1.2.2.1 创建 RAM 用户

创建 RAM 用户

1.2.2.2 授权 RAM 用户

授权 RAM 用户

汇总下阿里云认证信息

用户登录名称 terraform@1004009909390121.onaliyun.com
AccessKey ID LTAI5tH8nYXXXX
AccessKey Secret sMIec7G5WKkfbXXXXX

1.2.4 配置认证变量

通常来说不建议认证信息在 清单 中直接使用例如这里的 AK、SK,所以,这里采用环境变量的方式

使用 TF_VAR_ 开头定义变量,便于在清单中使用,需要注意的是清单中只需 TF_VAR_ 后面的变量名即可

$ export TF_VAR_ALICLOUD_ACCESS_KEY="LTAI5tH8nYSJKXXXX"
$ export TF_VAR_ALICLOUD_SECRET_KEY="sMIec7G5WKkfbXXXXX"
$ export TF_VAR_ALICLOUD_REGION="cn-beijing"

OK,到此安装配置完成,接下来为了提供开发效率,还需要对开发环境进行配置

1.2.3 开发环境

(1)安装插件

以 Goland 为例,首先安装 插件 “Terraform and HCL”,此插件提供基础的语法补全、高亮功能

(2)配置工具

第一步,设置工具执行路径

File -> Settings -> Tools -> Terraform

Terraform execute path

Goland 存在 bug,不要使用输入框后的文件选择功能,它不会补全完整路径,也无法从环境变量中获取到 terraform 的完整路径,具体问题看这里,所以我们自己将 terraform 执行文件填入输入框即可

第二步,配置工具

点击 “Select Run/Debug Configuration” -> “Edit Configurations”

这里暂时配置三个动作

  • init:初始化项目下载 Providers

    初始化项目下载

  • plan:根据配置清单创建执行计划(更新、删除资源),用于对比技术设施 当前状态期望状态

  • apply:按照计划顺序执行动作

  • destroy:销毁资源

到此,配置完成,接下来,通过一个 terraform 小例子来检查一下整个环境的有效性

1.3 上手体验

1.3.1 目录结构

创建目录 demo1

$ tree
.
├── alicloud_security_group.tf
├── alicloud_vpc.tf
├── main.tf
├── variables.tf
└── versions.tf

在 tf 执行资源操作时,凡是以 .tf 后缀名的文件,会被自动载入,所以按照所操作的资源类型进行拆分,以便于更清晰的维护和管理

1.3.2 文件说明

首先,先看 versions.tf

terraform {
  // terraform 版本
  required_version= ">= 1.1.9"
  required_providers {
    // 阿里云 Provider 版本
    alicloud = {
        source = "aliyun/alicloud"
        version = "1.197.0"
    }
  }
}

variables.tf

// 这里只定义了变量的名称,并未定义值
// 具体的值建议在系统环境变量中定义
variable "ALICLOUD_ACCESS_KEY" {
  type = string
}

variable "ALICLOUD_SECRET_KEY" {
  type = string
}

variable "ALICLOUD_REGION" {
  type = string
}

main.tf

provider "alicloud" {
    // 引用变量配置 Provider 认证信息
    region     = var.ALICLOUD_REGION
    access_key = var.ALICLOUD_ACCESS_KEY
    secret_key = var.ALICLOUD_SECRET_KEY
}

alicloud_vpc.tf

vpc 文档:https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vpc

vswitch 文档:https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch

// VPC 网络定义
resource "alicloud_vpc" "vpc" {
  vpc_name   = "tf_vpc_demo1"
  cidr_block = "172.16.0.0/12"
}

//switch 交换机
resource "alicloud_vswitch" "vsw" {
  // 参数资源引用:<resource type>.<name>.<attribute>
  vpc_id     = alicloud_vpc.vpc.id
  cidr_block = "172.16.0.0/21"
  zone_id    = "cn-beijing-b"
}

alicloud_security_group.tf

security_group 文档:https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group

security_group_rule 文档:https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule

resource "alicloud_security_group" "group" {
  name                  = "tf_sg_demo1"
  description           = "terraform security group resource"
  vpc_id                = alicloud_vpc.vpc.id
  security_group_type   = "normal" // normal 普通级 enterprise 企业级
}

resource "alicloud_security_group_rule" "allow_80_tcp" {
  type                  = "ingress"
  ip_protocol           = "tcp"
  nic_type              = "intranet"
  policy                = "accept"
  port_range            = "80/80"
  priority              = 1
  security_group_id     = alicloud_security_group.group.id
  cidr_ip               = "0.0.0.0/0"
}

resource "alicloud_security_group_rule" "allow_22_tcp" {
  type                  = "ingress"
  ip_protocol           = "tcp"
  nic_type              = "intranet"
  policy                = "accept"
  port_range            = "22/22"
  priority              = 1
  security_group_id     = alicloud_security_group.group.id
  cidr_ip               = "0.0.0.0/0"
}

1.3.3 init 初始化

此阶段会自动下载所需要的 Provider,下载过程可能需要科学上网,如果没有条件,可以先把 Provider 通过其他方式下载下来,然后放置以下目录

windows 系统:plugin-cache/registry.terraform.io/aliyun/alicloud//windows_amd64/

linux 系统:plugin-cache/registry.terraform.io/aliyun/alicloud//linux_amd64/

Goland 执行 init 工具动作

1.3.4 plan 生成执行计划

1.3.5 plan 应用执行计划

1.3.6 检查资源创建情况

VPC 网络 tf_vpc_demo1 创建成功

VSwitch 交换机 创建成功

安全组 创建成功

安全组规则 创建成功

检查完毕,所有资源全部创建成功

1.3.7 destroy 销毁资源

接下来,开始一步步的学习 Terraform 语法,这些资源暂不不需要,注销掉即可


文章作者: Da
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Da !
  目录