Terraform Best Practices

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

一、安装 Terraform

1、下载 Terraform

官方提供了最新版本的Terraform 可用下载

输入下载及安装命令行:

# download terraform
wget https://releases.hashicorp.com/terraform/1.0.10/terraform_1.0.10_linux_amd64.zip --no-check-certificate

# unzip terraform
unzip terraform_1.0.10_linux_amd64.zip

2、 配置环境变量

添加Terraform的环境变量,或者直接放在 /usr/local/bin/ 目录下

二、使用 Terraform 管理腾讯云

下面是Terraform管理腾讯云资源的具体方法:

1、 Terraform工作流程

1、 一次性配置 provider 文件以支持Tencent Cloud的 OpenAPI.
2、使用Terraform配置语法生成 .tf 资源文件.
3、使用CLI实现腾讯云资源的管理.

Terraform会将整个资源部署情况更新在 *.tf.state 文件中,让用户在前端控制台和后端平台都清晰的把控自己的云资源。

2、 配置腾讯云 provider 文件

官方文档:TencentCloud Provider

登录腾讯云,在访问管理中选择API秘钥管理,获得Secret_Id和Secret_Key

在新目录下创建 provider.tf 文件,填入秘钥和区域信息

$ vim provider.tf

terraform {
required_providers {
tencentcloud = {
source = "tencentcloudstack/tencentcloud"
version = "1.60.5"
}
}
}

provider "tencentcloud" {
secret_id = "*******"
secret_key = "*******"
region = "*******"
}

保存该文件,执行 terraform init 初始化Terraform。

此步骤,Terraform会自动检测 provider.tf 文件中的 provider 字段,发送请求到Terraform官方GitHub下载最新版本腾讯云资源的模块和插件,初始化成功时当前脚本的版本信息也会显示出来。

# Initialize
$ terraform init

当腾讯云脚本有新的版本发布时,可以通过 terraform init -upgrade 指令更新脚本,获取最新的应用。

同时,可以通过 terraform plan 预览将要完成的操作,准备好创建资源后,可以通过 terraform apply 进行资源部署,更多有关Terraform CLI 的信息请点击这里

tips: NOTES 将秘钥直接填入到.tf文件中是十分不安全的,在多用户共同管理资源时,不建议把腾讯云API 的秘钥直接写到源代码里,以免一不小心更新到公开的版本中,造成安全风险。

腾讯云提供了另一种更为安全可靠的方式,把秘钥信息放在环境变量中配置

# Configure the secret key in the environment path
$ export TENCENTCLOUD_SECRET_ID="your_accessid"
$ export TENCENTCLOUD_SECRET_KEY="your_accesskey"
$ export TENCENTCLOUD_REGION="ap-shanghai"

这样在 provider.tf 文件中就可以省略掉相关信息

$ vim provider.tf

provider "tencentcloud" {}

3、 部署腾讯云资源

下面提供一个创建腾讯云对象存储(COS)存储桶的实际用例。

创建实例资源文件

resource "tencentcloud_cos_bucket" "mycos" {
bucket = "mycos-1251762279"
acl = "private"
}

resource "tencentcloud_cos_bucket_object" "myobject" {
bucket = tencentcloud_cos_bucket.mycos.bucket
key = "new_object_key"
content = "the content that you want to upload."
}

这里可以看到,上传文件至存储桶没有直接填写具体参数信息,而是引用 “tencentcloud_cos_bucket.mycos.bucket”

执行 terraform plan 查看部署计划,一共有2个资源计划创建

这里参数前面的+ 代表新添加的资源,当销毁资源时,参数前面对应的符号会变为- ;更改一些参数需要重新部署资源时,该资源前面的符号为-/+;在旧参数和新参数内容之间有→ 符号标识

执行 terraform apply 进行资源创建


回到控制台,可以看到刚刚部署的资源已经生效

执行 terraform destroy 进行资源销毁(控制台中也同步了销毁操作)


三、使用 Terraform 管理 Helm

下面是Terraform管理 Helm 的具体方法:

1、 配置 Helm provider 文件

官方文档:Helm Provider

修改 provider.tf 文件并初始化

terraform {
required_providers {
tencentcloud = {
source = "tencentcloudstack/tencentcloud"
version = "1.60.5"
}
helm = {
source = "hashicorp/helm"
version = "2.4.0"
}
}
}

provider "tencentcloud" {}

provider "helm" {
kubernetes {
config_path = "/etc/rancher/k3s/k3s.yaml"
}
}

2、 部署 Helm Chart

这里提供一个 Mysql Chart 的简单用例

Helm 官方文档
Artifact Hub

Helm Chart仓库

创建实例资源文件

resource "helm_release" "mysql" {
name = "mysql-terraform"
chart = "mysql"
version = "8.8.14"
namespace = "blazehu"

repository = "https://charts.bitnami.com/bitnami"

set {
name = "auth.rootPassword"
value = "123456!@#"
}
}

这里可以看到通过 set 重新设置了 mysqlroot 密码

执行 terraform plan 查看部署计划,一共有3个资源计划创建


执行 terraform apply 进行资源创建

控制台,可以看到 Helm Chart 部署完成,且相关资源都正常启动

反复执行 terraform apply 进行资源更新,可以看到资源没有变更

tips:可以通过 ignore_changes 忽略部分变更的更新动作

执行 terraform destroy 进行资源销毁(控制台中也同步了销毁操作)

参考文档