Terraform基础

87 阅读3分钟

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"
  }
}