Terraform: 如何只应用一个tf文件

87次阅读
没有评论

问题描述

在使用Terraform时,有一个需求是只想对一个特定的tf文件进行应用,而不是应用整个目录下的所有tf文件。他想知道是否有办法实现这个需求。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在Terraform中,没有直接应用一个特定的tf文件的功能。但是,你可以使用-target参数来指定应用一个特定的资源或模块。
以下是一些解决方案:
1. 使用-target参数来指定应用一个特定的资源。例如,如果你只想应用securitygroup.tf文件中的一个安全组,可以使用以下命令:

terraform apply -target=aws_security_group.my_sg

这将只应用一个安全组,但如果你有很多安全组,这种方法可能会变得繁琐。你也可以在一个命令中指定多个资源:

terraform apply -target=aws_security_group.my_sg -target=aws_security_group.my_2nd_sg
  1. 创建一个模块。你可以像应用一个普通资源一样,使用-target参数来指定应用一个模块。在模块内部,你可以定义所有的安全组,就像在模块外部一样。这样做还可以方便地在其他基础设施中重用相同的安全组。
    以下是一个示例:
terraform apply -target="module.my_security_groups"

在上面的示例中,我们使用-target参数来指定应用一个名为my_security_groups的模块。
请注意,使用-target参数时,Terraform会考虑资源之间的依赖关系。这意味着如果你指定了一个资源作为目标,它依赖的其他资源的更改也会包含在计划中。

方案2

使用脚本或工具来管理应用顺序可能会增加复杂性,并且需要确保资源之间的依赖关系正确设置。
另一种方法是编写脚本或使用工具来控制应用的顺序。你可以使用terraform apply命令手动控制应用的顺序,或者使用一些第三方工具来管理资源的依赖关系。
以下是一个简单的bash脚本示例,可以按顺序应用多个tf文件中的资源:

#!/bin/bash
# 应用第一个tf文件
terraform apply -auto-approve -var-file=first.tfvars
# 应用第二个tf文件
terraform apply -auto-approve -var-file=second.tfvars
# 应用其他tf文件...

在这个示例中,我们使用terraform apply命令按顺序应用多个tf文件中的资源。你可以根据需要添加更多的terraform apply命令来应用其他tf文件中的资源。
请注意,这种方法需要手动控制资源的依赖关系,并确保在应用之前正确设置这些依赖关系。

方案3

请注意,这种方法可能会违反基础设施即代码的原则,因为*.tf文件的规范与实际状态可能不一致。
如果你只是想临时应用一个特定的代码片段,你可以使用注释来控制应用的范围。例如,你可以将要应用的代码放在一个tf文件中,然后在需要应用时取消注释,不需要应用时注释掉。
以下是一个示例:
1. 假设你有两个tf文件,分别是1st.tf2nd.tf,用于创建GCP(Google Cloud Platform)的资源。
2. 在1st.tf中,你可以放置以下代码:

provider "google" {
  credentials = file("myCredentials.json")
  project     = "myproject-113738"
  region      = "asia-northeast1"
}

resource "google_project_service" "project" {
  service = "iam.googleapis.com"
  disable_dependent_services = true
}
  1. 2nd.tf中,你可以放置以下代码,并将其注释掉:
# resource "google_service_account" "service_account_1" {
#   display_name = "Service Account 1"
#   account_id   = "service-account-1"
# }
# resource "google_service_account" "service_account_2" {
#   display_name = "Service Account 2"
#   account_id   = "service-account-2"
# }
  1. 当你只想应用1st.tf中的代码时,你可以取消注释2nd.tf中的代码,并运行以下命令:
terraform apply -auto-approve
  1. 当你想应用2nd.tf中的代码时,你可以注释掉2nd.tf中的代码,并运行相同的命令。
    这种方法可以让你根据需要选择要应用的代码,但请注意,这种方法可能会导致*.tf文件的规范与实际状态不一致,因此不建议长期使用。

正文完