0

使用 Terraform 0.12.6

我有一个包含多个*.tf文件的目录,例如,product1.tfproduct2.tf。我如何执行terraform plan并随后执行terraform apply某个 *.tf 文件?我希望这将是一个-target选项,但我阅读了文档并没有看到提到这一点。

4

2 回答 2

2

你不能。Terraform 将.tf一个目录中的所有文件连接起来,并同时处理它们。

您可以使用-target来定位特定资源,但它不知道它们都在哪个文件中。

-target一般来说,应该谨慎地用作逃生舱口,如果您需要一次运行单独的 Terraform 位,则将您的 Terraform 代码拆分为单独的目录和状态文件。

这也在文档中进行了讨论:

此定位功能是为特殊情况提供的,例如从错误中恢复或解决 Terraform 限制。不建议将其-target用于日常操作,因为这可能会导致未检测到的配置漂移以及对资源的真实状态如何与配置相关的混淆。

与其-target用作对非常大配置的孤立部分进行操作的方法,不如将大型配置分解为几个较小的配置,每个配置都可以独立应用。数据源可用于访问有关在其他配置中创建的资源的信息,从而允许将复杂的系统架构分解为可独立更新的更易于管理的部分。

于 2019-08-01T15:54:19.673 回答
0

不,你不能。不幸的是,Terraform没有应用特定 .tf 文件的功能。Terraform应用同一目录中的所有 .tf 文件

但是您可以应用带有注释取消注释的特定代码。例如,您在同一目录中有 2 个 .tf 文件“1st.tf”“2nd.tf”来为GCP(Google Cloud Platform)创建资源:

在此处输入图像描述

然后,“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
}

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

现在,首先,您只想应用“1st.tf”中的代码,因此您需要注释掉“2nd.tf”中的代码:

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
}

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

然后,您申请:

terraform apply -auto-approve

接下来,另外,您要应用“2nd.tf”中的代码,因此您需要取消注释“2nd.tf”中的代码:

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
}

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

然后,您申请:

terraform apply -auto-approve

这样,您可以应用带有注释取消注释的特定代码

于 2022-01-31T23:50:55.517 回答