一、Terraform 快速开始
1.1 Terraform 是什么?
Terraform 是 HashiCorp 公司开发的产品,支持在多个云平台实现基础设施编排的开源的基础设施即代码(IaC)工具
1.1.1 基本工作原理
技术人员编写 HCL 代码文件(Hashicorp Configuration Language)
terraform 命令执行时,引擎读取分析代码文件,生成由
resource
与data
组成的图(Graph)通过 rpc 调用 data 与 resource 所对应的 Provider 插件
Provider 插件编写者需按照 “Terraform 制定的插件框架” 定义各种 data 和 resource 以及 CRUD 方法,CRUD 方法中完成对目标平台的操作(SDK、HTTP(S) API)
简单画个图,方便理解
1.2 Terraform 安装
1.2.1 下载
$ 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 用户
1.2.2.2 授权 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 语法,这些资源暂不不需要,注销掉即可