Terraform战术:DevOps 运维人员掌握Terraform命令指南
关于 Terraform
Terraform为何如此重要
日常活动和部署中常用的 Terraform 命令示例
关于 Terraform
Terraform 是由 HashiCorp 提供的开源基础设施即代码 (IaC) 工具,它使用户能够使用声明式配置语言定义和配置基础设施资源。通过代码定义基础设施,Terraform 可以自动创建、修改和删除跨多个云提供商、数据中心和服务的资源。这种方法增强了基础设施的可扩展性、可重复性和一致性。
Terraform为何如此重要
Terraform 通过提供以下几个关键优势,彻底改变了基础设施管理:
- 可扩展性:Terraform 通过代码简化了复杂基础设施设置的管理,从而实现了可扩展性和高效的资源配置。
- 一致性:在 Terraform 中定义的基础设施配置可确保跨环境的一致性,从而减少人为错误并提高可靠性。
- 协作:团队可以通过对 Terraform 配置进行版本控制来有效协作,从而实现无缝的基础设施更新和跟踪变更。
- 灵活性:Terraform 支持各种云提供商和服务,使 DevOps 团队能够使用统一的工具处理各种基础设施。
- 成本效益:通过采用 Terraform,组织可以优化资源使用、监控成本并实现资源生命周期管理的自动化。
日常活动和部署中常用的 Terraform 命令示例
显示版本
terraform version
描述:显示当前已安装的 Terraform 版本以及有关 Terraform 安装的信息。
例子:
terraform version
输出:
Terraform v1.9.5
初始化 Terraform 配置
`terraform init` 命令对于设置 Terraform 项目至关重要。它会下载必要的插件,初始化后端,并确保项目已准备好进行后续的 Terraform 操作。
terraform init
描述:初始化新的或现有的 Terraform 配置。此命令通过下载和安装提供程序插件来准备其他 Terraform 命令的工作目录。
示例:
terraform init
输出:
Initializing the backend...
Initializing provider plugins...
- Checking for available provider plugins...
- Downloading plugin for provider "aws" (hashicorp/aws) 3.47.0...
- Downloading plugin for provider "null" (hashicorp/null) 3.1.0...
- Downloading plugin for provider "template" (hashicorp/template) 2.2.0...
Terraform has been successfully initialized!
terraform init -migrate-state
描述:此命令用于将现有状态文件迁移到新的状态存储后端。
例子:
terraform init -migrate-state
输出:
Migrating state...
Migration successful! State files have been moved to the new backend.
terraform init -upgrade
描述:此命令用于将 Terraform 模块和插件升级到最新版本。
例子:
terraform init -upgrade
输出:
Upgrading Terraform modules and plugins...
Upgrade successful! Modules and plugins are now up to date.
terraform init -backend-config=backend.tf
描述:使用后端配置文件(例如 backend.tf)中指定的后端配置初始化 Terraform,允许您在初始化期间指定后端配置选项,从而灵活地控制 Terraform 与后端交互以存储状态数据的方式。
例子:
terraform init -backend-config=backend.tf
输出:
Initializing Terraform with backend configuration from backend.tf...
Initializing the backend...
- Using backend configuration from backend.tf
Initializing provider plugins...
- Checking for available provider plugins...
- Downloading plugin for provider "aws" (hashicorp/aws) 3.47.0...
- Downloading plugin for provider "null" (hashicorp/null) 3.1.0...
Terraform has been successfully initialized with the specified backend configuration.
terraform init -reconfigure
描述:此命令用于强制重新配置后端,即使后端已经配置好。
例子:
terraform init -reconfigure
输出:
Reconfiguring backend...
Backend reconfiguration successful! Ready for deployment.
管理工作区
在 Terraform 中管理工作区可以将基础设施配置划分为不同的环境或阶段,从而更容易维护和管理基础设施部署。
terraform workspace new
描述:创建一个新的 Terraform 工作区。
示例:
terraform workspace new staging
输出:
Created and switched to workspace "staging".
terraform workspace list
描述:列出所有可用的工作区。
示例:
terraform workspace list
输出:
default
staging
production
terraform workspace select
描述:切换到特定工作区。
示例:
terraform workspace select production
输出:
Switched to workspace "production".
terraform workspace show
描述:显示当前工作区。
示例:
terraform workspace show
输出:
Current workspace: production
terraform workspace delete
描述:删除指定的工作区。
示例:
terraform workspace delete staging
输出:
Deleted workspace "staging" and switched to "default" workspace.
规划基础设施/资源变更
在配置基础设施时,Terraform 会在应用任何更改之前创建一个执行计划,以便您可以在应用更改之前预览 Terraform 将对您的基础设施所做的更改。
terraform plan
描述:创建一个执行计划,允许您预览 Terraform 计划对您的基础架构进行的更改。
示例:
terraform plan
输出:
Refreshing Terraform state...
...
Plan: 3 to add, 0 to change, 0 to destroy.
terraform plan -var-file="prod.tfvars"
描述:使用 tfvars 文件创建执行计划,允许您预览 Terraform 计划在特定环境(例如生产环境)中对您的基础架构所做的更改。
示例:
terraform plan -var-file="prod.tfvars"
输出:
Refreshing Terraform state...
...
Plan: 15 to add, 3 to change, 5 to destroy.
terraform plan -target="aws_instance.my_ec2"
描述:使用 -target 选项创建执行计划,以指定目标资源、模块或资源集合。
示例:
terraform plan -target="aws_instance.my_ec2"
输出:
Refreshing Terraform state...
...
Plan: 4 to add, 0 to change, 0 to destroy.
terraform plan -target="aws_instance.my_ec2" -var-file="prod.tfvars"
描述:使用 -target 选项和 tfvars 文件为您的基础架构创建执行计划,以针对特定环境(例如生产环境)中的特定资源、模块或资源集合。
示例:
terraform plan -target="aws_instance.my_ec2" -var-file="prod.tfvars"
输出:
Refreshing Terraform state...
...
Plan: 4 to add, 0 to change, 0 to destroy.
terraform plan -out=tfplan
描述:使用 `-out` 标志保存计划。之后,您可以应用已保存的计划,Terraform 将仅执行计划中列出的更改。在自动化 Terraform 流水线中,应用已保存的计划文件可确保 Terraform 仅执行您预期的更改,即使您的流水线在不同时间跨多台机器运行。
示例:
terraform plan -out=tfplan
输出:
Saving a plan to tfplan
应用基础设施/资源变更
当您对基础架构进行更改时,Terraform 会使用初始化期间安装的提供程序和模块来执行存储在执行计划中的步骤。
terraform apply
描述:根据您的计划进行更改,以创建或更新资源。
示例:
terraform apply
输出:
Refreshing Terraform state...
...
Plan: 10 to add, 2 to change, 0 to destroy.
terraform apply tfplan
描述:应用指定的计划文件,方法是提供使用 `terraform plan -out` 命令生成的计划文件。
示例:
terraform apply tfplan
输出:
Refreshing Terraform state...
...
Apply complete! Resources: 7 added, 0 changed, 0 destroyed.
terraform apply -var-file="prod.tfvars"
描述:类似于 `terraform plan -var-file="prod.tfvars"` 命令,但它会使用 tfvars 文件应用配置。
示例:
terraform apply -var-file="prod.tfvars"
输出:
Refreshing Terraform state...
...
Apply complete! Resources: 15 added, 3 changed, 5 destroyed.
terraform apply -target="aws_instance.my_ec2"
描述:类似于 `terraform plan -target="aws_instance.my_ec2"` 命令,但它会使用目标定位功能将更改应用到特定资源。
示例:
terraform apply -target="aws_instance.my_ec2"
输出:
Refreshing Terraform state...
...
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
terraform apply -target="aws_instance.my_ec2" -var-file="prod.tfvars"
描述:使用目标定位功能,在特定环境(例如生产环境)中对特定资源应用更改。
示例:
terraform apply -target="aws_instance.my_ec2" -var-file="prod.tfvars"
输出:
Refreshing Terraform state...
...
Apply complete! Resources: 5 added, 0 changed, 0 destroyed.
摧毁基础设施/资源
一旦不再需要基础设施,您可能需要将其销毁,以降低安全风险和成本。
terraform destroy
描述:终止由您的 Terraform 项目管理的底层架构资源。
示例:
terraform destroy
输出:
...
Destroy complete! Resources: 3 destroyed.
terraform destroy -target="aws_instance.my_ec2"
描述:仅销毁目标基础设施资源。
示例:
terraform destroy -target="aws_instance.my_ec2"
输出:
...
Destroy complete! Resources: 1 destroyed.
terraform destroy -target="aws_instance.my_ec2" -var-file="prod.tfvars"
描述:仅销毁特定环境(例如生产环境)中的目标基础设施资源。
示例:
terraform destroy -target="aws_instance.my_ec2" -var-file="prod.tfvars"
输出:
...
Destroy complete! Resources: 1 destroyed.
污染/未污染资源
Terraform 有一个名为“tainted”的标记,它用于跟踪对象可能已损坏,因此未来的 Terraform 计划应该替换它。
terraform taint aws_instance.my_ec2
描述:此命令通知 Terraform 某个特定对象已降级或损坏,需要在下次应用时重新创建。
示例:
terraform taint aws_instance.my_ec2
输出:
Resource instance aws_instance.my_ec2 has been marked as tainted.
terraform untaint aws_instance.my_ec2
描述:移除受污染资源中的污染。
示例:
terraform untaint aws_instance.my_ec2
输出:
Resource instance aws_instance.my_ec2 has been successfully untainted.
管理状态文件
Terraform 必须存储有关您托管的基础设施和配置的状态。Terraform 使用此状态将实际资源映射到您的配置、跟踪元数据并提高大型基础设施的性能。默认情况下,此状态存储在名为“terraform.tfstate”的本地文件中。
terraform state list
描述:此命令用于列出状态文件中的资源。
示例:
terraform state list
输出:
aws_instance.foo
aws_instance.bar[0]
aws_instance.bar[1]
module.elb.aws_elb.main
terraform state list aws_instance.bar
描述:此命令用于按资源筛选,仅列出具有给定名称的资源。
示例:
terraform state list aws_instance.bar
输出:
aws_instance.bar[0]
aws_instance.bar[1]
terraform state pull > example.tfstate
描述:此命令用于手动下载远程状态并将其输出到本地文件。此命令也适用于本地状态。
示例:
terraform state pull > example.tfstate
terraform state push
描述:此命令用于手动将本地状态文件上传到远程状态。此命令也适用于本地状态。此命令应尽量避免使用。它仅作为实用工具,用于在需要手动干预远程状态时使用。
示例:
terraform state push
terraform state rm aws_instance.bar
描述:Terraform 将在系统中搜索与给定资源地址匹配的所有实例,并删除每个实例的记录,以便 Terraform 不再跟踪相应的远程对象。
示例:
terraform state rm aws_instance.bar
其他命令
terraform force-unlock <LOCK_ID>
说明:此操作不会修改您的基础架构。此命令会移除当前配置状态的锁定。此锁定的行为取决于所使用的后端。本地状态文件无法被其他进程解锁。
示例:
terraform force-unlock <LOCK_ID>
输出:
Lock ID LOCK_ID released
terraform show -json
描述:此命令将显示计划、配置和当前状态的 JSON 表示形式。
示例:
terraform show -json
输出:
{
"aws_instance.example": {
"type": "aws_instance",
"depends_on": [],
"primary": {
"id": "i-1234567890abcdef0",
"attributes": {
"ami": "ami-0c55b159cbfafe1f0",
"instance_type": "t2.micro",
"tags": {
"Name": "example-server"
}
}
}
}
}