共计 5416 个字符,预计需要花费 14 分钟才能阅读完成。
1、安装 terrafrom
contos 7 安装
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install terraform
查找文件
sudo find / -name 配置文件名
本地 MACBOOK 安装
brew tap hashicorp/tap
brew install hashicorp/tap/terraform
# 或下载二进制包,解压后,放到 /usr/local/bin 目录下


2、认证与鉴权
可以配置静态凭证,在 provider.tf 配置文件中添加 AK/SK 信息,如下所示。
provider "alicloud" {
region = "cn-north-1"
access_key = "my-access-key"
secret_key = "my-secret-key"
}
环境变量
vim ~/.bash_profile
# 阿里云 第一种方式,需要去掉 main.tf 中的变量,直接全空即可,此变量是官方默认提供变量,不需要加 TF_VAR
export ALICLOUD_REGION="cn-shanghai"
export ALICLOUD_ACCESS_KEY="my-access-key"
export ALICLOUD_SECRET_KEY="my-secret-key"
# 阿里云 第二种方式,加 TF_VAR,然后在 variables.tf 文件 -- 定义变量使用变量
export TF_VAR_ali_region="cn-shanghai"
export TF_VAR_ali_access_key="my-access-key"
export TF_VAR_ali_secret_key="my-secret-key"
其他云样例:
# 华为云
export HW_REGION_NAME="cn-north-1"
export HW_ACCESS_KEY="my-access-key"
export HW_SECRET_KEY="my-secret-key"
# 腾讯云
export TENCENTCLOUD_SECRET_ID="my-access-key
export TENCENTCLOUD_SECRET_KEY="my-secret-key
source ~/.bash_profile
每个 Terraform 项目都需要创建 1 个独立的工作目录,
mkdir terra-ali
cd terra-ali

Terraform 在运行时,会读取该目录空间下所有.tf 和.tfvars 文件。因此,您可以按照实际用途将配置信息写入到不同的文件中。
在工作目录下创建 variables.tf 文件,定义好变量, 定义的变量会从环境变量中取值 分别对应 bash_profile 文件中的 TF_VAR_ali_access_key,TF_VAR_ali_secret_key,TF_VAR_ali_region
variable "ali_access_key"{
type = string
}
variable "ali_secret_key"{
type = string
}
variable "ali_region"{
type = string
}
5、versions.tf 文件 – 指定版本
在工作目录下创建 versions.tf 文件,指定 registry 源和版本,文件内容如下:
阿里云 ”versions.tf” 文件
terraform {
required_version = ">= 1.1.7"
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "1.209.0"
}
}
}
华为云 ”versions.tf” 文件
terraform {
required_providers {
huaweicloud = {
source = "huaweicloud/huaweicloud"
version = ">= 1.54.0"
}
}
}
6、main.tf 文件
定义阿里云登录信息,使用环境变量
provider "alicloud" {
region = var.ali_region
access_key = var.ali_access_key
secret_key = var.ali_secret_key
}
或者按照各云厂商给的变量名,不带 TF_VAR,直接使用默认的环境变量,
# 阿里云
provider "alicloud" {}
# 华为云
provider "huaweicloud" {}
# 腾讯云
provider "tencentcloud" {
region = "ap-guangzhou"
}
7、创建需要资源的文件
可以分别写一个文件,也可以统一写到一个文件 terraform.tf
比如创建 VPC,可以去控制台看哪些是必要参数,alicloud provider文档来编写资源,写到 alicloud_vpc.tf 里
< 资源类型 >.< 名称 >.< 属性 > alicloud_vpc.myvpc
resource "alicloud_vpc" "myvpc" {
# VPC 名称
vpc_name = "alicloud"
# VPC 地址块
cidr_block = "10.1.0.0/21"
}
resource "alicloud_vswitch" "myvsw" {
# VPC ID
vpc_id = alicloud_vpc.myvpc.id
# 交换机地址块
cidr_block = "10.1.0.0/24"
# 可用区
availability_zone = "cn-shanghai-n"
# 资源依赖, 会优先创建该依赖资源
depends_on = [alicloud_vpc.main]
}
比如创建安全组,可以去控制台看哪些是必要参数,写到 alicloud_security_group.tf 里
resource "alicloud_security_group" "mygroup" {
name = "cgj-test-group"
vpc_id = alicloud_vpc.myvpc.id
# 普通级安全组
security_group_type = "normal"
}
# 添加放通规则
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.mygroup.id
cidr_ip = "0.0.0.0/0"
}
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.mygroup.id
cidr_ip = "0.0.0.0/0"
}
创建 ECS,可以去控制台看哪些是必要参数,写到 alicloud_ecs.tf 里
install-nginx.sh 脚本
#!/bin/bash
until [-f /var/lib/cloud/instance/boot-finished ]; do
sleep 1
done
yum -y install nginx
echo "Hello Terraform" > /usr/share/nginx/html/index.html
systemctl start nginx
resource "alicloud_instance" "myecs" {
resource "alicloud_instance" "myecs" {
availability_zone = "cn-shanghai-n"
security_groups = alicloud_security_group.mygroup.*.id
#spot_strategy 按量付费
spot_strategy = "NoSpot"
instance_type = "ecs.c6.large"
system_disk_category = "cloud_efficiency"
image_id = "centos_7_5_x64_20G_alibase_20211130.vhd"
instance_name = "tf_ecs"
vswitch_id = alicloud_vswitch.myvsw.id
# 指定了 internet_max_bandwidth_out= 10,因此会自动为实例分配一个公网 IP
internet_max_bandwidth_out = 10
password = "admin123!"
#“provisioner”块通常用来在资源创建之后执行一些额外的操作,如上传文件、运行脚本等。
provisioner "file" {
source = "install-nginx.sh"
destination = "/tmp/install-nginx.sh"
}
provisioner "remote-exec" {
inline = [
"chmod +x /tmp/install-nginx.sh && sh /tmp/install-nginx.sh"
]
}
# 用于在 Terraform 中为资源定义 HTTPS、SSH、WinRM、数据库或其他连接和认证信息
connection {
type = "ssh"
user = "root"
password = "admin123!"
host = self.public_ip
}
}
8、初始化工作目录
每个 Terraform 项目在新建 Terraform 工作目录并创建配置文件后,都需要初始化工作目录。
terraform init

在同一个工作目录下,terraform init 命令可以重复执行。我们可以使用 “-upgrade=true” 选项对使用的 Provider 和 Modules 进行更新。
terraform init -upgrade=true
9、fmt 格式化代码
用于格式化代码,增强其可读性
terraform fmt
10、校验配置项中是否有报错的地方
terraform validate
11、打印所有资源的期望状态
将期望资源的状态与当前工作目录的状态进行对比
打印当前状态与期望状态的差异,并不会实际实行
terraform plan
12、apply 创建资源
terraform apply

13、资源的展示
show 命令用于展示当前 state 中所有被管理的资源及其所有属性值
terraform show
14、资源的释放
destroy 命令用于对资源的释放操作
terraform destroy 默认会释放当前模板中定义的所有资源,如果只想释放其中某个特定的资源,可以通过参数 -target=< 资源类型 >.< 资源名称 > 来指定。
terraform destroy
terraform destroy -target=alicloud_security_group_rule.allow_22_tcp
注意:如果手动在 terraform 创建的资源上新增了一些资源,有些有依赖的会释放不了。如在 terraform 创建的 vpc 下手动创建子网,因为手动创建的子网没有被 terraform 纳管,子网释放不了,那么释放这个 VPC 的时候会失败,vpc 必须下面没有子网。

Terraform Init 加速
阿里云
华为云
腾讯云
开启日志
环境变量添加如下可查看日志
export TF_LOG=DEBUG
export TF_LOG_PATH=/var/log/terraform.log
常见报错
在此过程中,Terraform 进程意外退出而没有及时释放状态锁,需要手动解锁。
此时其他执行环境需要等待当前进程执行完毕,或可按照文中的英文提示加入 -lock=false 忽略状态锁重新执行(不推荐该方式)。
第一种
terraform force-unlock -force 3bbf656d-3d6c-6c74-8a39-c391a0d96e4a
第二种
删除的 terraform.tfstate 文件也可解锁。
