1. 基础命令
terraform init:初始化加载模块
terraform plan:资源的预览
terraform apply:资源的新建和变更
terraform fmt -recursive:将目录下所有Terraform文件格式化,包含子目录
terraform show:资源的展示
terraform destroy:资源的释放
terraform import:资源的导入
terraform taint:标记资源为被污染
terraform untaint:取消被污染标记
terraform output:打印出参及其值
terraform state list:列出当前state中的所有资源
terraform state pull:获取当前state内容并展示
terraform state rm:移除特定的资源;命令格式为:terraformstate rm <资源类型>.<资源名称>
terraform refresh:刷新当前state
terraform graph | dot -Tsvg > graph.svg: 输出当前模板定义的资源关系图
terraform validate:验证模板语法是否正确
terraform workspace new xxx:创建并进入新的工作空间
参数
-parallelism=n 用于控制Terraform操作(如创建、更新或销毁资源)时的并发度。这里的 n 是一个整数,代表了Terraform同时执行的操作的最大数量。
2. 踩坑
- 可读性方面[*]比 * 好。这样获取所有属性的信息就不需要使用for循环了。
- 注意机器的资源如果是有 force new 的,不会在原有机器上面修改,而是会删除重建,比如数ecs挂载2块数据盘 (之前的instance是一个data{}块),如果此时写2个data{}块,则会删除旧instance重新生成新的instance, 很危险,这是因为ecs的说明是force new, 因此有这种说明的资源要注意。正确的做法是, 找购买磁盘和附加磁盘的函数,新购并附加到ecs上。
3. 状态文件管理
若需要对资源做全生命周期管理则状态文件(terraform.tfstate)的管理至关重要,以下介绍两种状态文件管理的方案。
3.1. 方案一:存储在对象存储
参考文档:developer.hashicorp.com/terraform/l…
例,存储在OSS:
terraform {
backend "oss" {
bucket = "hiexpatcn-bj-dev-oss-r7kq26ej"
prefix = "prod/app/"
key = "terraform.tfstate"
endpoint = "oss-cn-beijing.aliyuncs.com"
}
}
存储在S3:
terraform {
backend "s3" {
bucket = "terraform-state-prod"
key = "network/terraform.tfstate"
region = "us-east-1"
assume_role = {
role_arn = "arn:aws:iam::PRODUCTION-ACCOUNT-ID:role/Terraform"
}
}
}
3.2. 方案二:存储在consul
使用 Consul 作为远程状态存储可以提供更好的协作和安全性。
参考:developer.hashicorp.com/terraform/l…
Consul是HashiCorp推出的一个开源工具,主要用来解决服务发现、配置中心以及Service Mesh等问题;Consul本身也提供了类似ZooKeeper、Etcd这样的分布式键值存储服务,具有基于Gossip协议的最终一致性,所以可以被用来充当Terraform Backend存储。
安装consul
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install -y consul
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install consul
brew tap hashicorp/tap
brew install hashicorp/tap/consul
Windows系统则需要下载后解压,根据路径配置环境变量即可。
下载连接:developer.hashicorp.com/consul/inst…
安装完成后的验证
$ consul
启动一个测试版Consul服务
# 只允许本机访问,默认端口8500
$ consul agent -dev
# 允许所有IP访问,端口8080
$consul agent -dev -client=0.0.0.0 -http-port=8080 -ui
Consul会在本机8500端口开放Http终结点,我们可以通过浏览器访问http://localhost:8500。
terraform {
backend "consul" {
address = "localhost:8500"
scheme = "http"
path = "my_project"
}
}