如何将 .tf 文件作为 Terraform Apply 命令的输入?

How to give a .tf file as input in Terraform Apply command?

我是 Terraform 的初学者。

我有一个包含 2 个 .tf 文件的目录。

现在我想 运行 Terraform Apply on a selected .tf file & neglect the other one.

我能做到吗?如果是,如何?如果不是,为什么以及最佳做法是什么?

您不能有选择地先应用一个文件再应用另一个文件。 (也许)实现目标的两种方式:

  • 使用 -target 标志在一个文件中定位资源,然后在另一个文件中定位资源。
  • 将每个文件(或更广泛地说,资源组,可能是多个文件)放在单独的 "modules"(文件夹)中。然后您可以 apply 它们分开。

将每个 terraform 配置文件放入单独的目录中正确完成了这项工作。 所以这是我的结构

├── aws
│   └── aws_terraform.tf
├── trash
│   └── main.tf

所有你需要做的:

  1. 进入各个文件夹
  2. terraform 初始化 && terraform 计划 && terraform 应用
  3. 输入 'yes' 确认地形应用

PS: '-target' 键没有帮助我。

您可以使用 terraform -target 标志。要么 您可以在单独的目录中拥有多个 Terraform 模块。然后你可以在那里terraform apply。 例如,假设您分别有 3 个 .tf 文件。但是你需要 运行 同时不止一个。如果你也需要更频繁地 运行 它们,最好有一个 terraform 模块。

terraform
    |--frontend
    |  └──main.tf
    |--backend-1
    |  └──main.tf
    |--backend-2
    |  └──main.tf
    |--modules-1
    |  └──module.tf

module.tf里面你可以定义你需要应用的文件。

module "frontend" {
  source = "terraform/frontend"
}

module "backend-1" {
  source = "terraform/backend-1"
} 

然后在模块目录下发出terraform apply。它会自动在这些路径中导入实例并应用它。

要么使用 --target 选项通过使用以下命令将模块指定为 运行

terraform apply -target=module.<module_name>

或者另一种解决方法是重命名具有 *.tf.disable 扩展名的其他 Terraform 文件,以通过 Terraform 加载来跳过它。目前正在 Code 加载 *.tf 个文件

不,不幸的是,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

这样,您可以应用所选代码 注释掉取消注释

如果您不能像其他答案所述那样将 terraform 文件放在不同的文件夹中。您可以尝试使用我的脚本 GitHub repo for script

这是一个脚本,在整个特定的 terraform 文件中运行并输出添加“-target=”到所有模块名称。

terraform apply -target nginx-docker.tf

这是 data 块的填充物,其他人已经解释过 resource

如果您正在执行读取操作,您还可以 target data 阻止。

假设您有两个文件 - create.tfread.tf

假设 create.tf 已经应用:

resource "hashicups_order" "edu" {
  items {
    coffee {
      id = 3
    }
    quantity = 3
  }
  items {
    coffee {
      id = 2
    }
    quantity = 1
  }
}

output "edu_order" {
  value = hashicups_order.edu
}

而你只想申请 read.tf:

data "hashicups_ingredients" "first_coffee" {
  coffee_id = hashicups_order.edu.items[0].coffee[0].id
}

output "first_coffee_ingredients" {
  value = data.hashicups_ingredients.first_coffee
}

您可以针对只读数据块创建计划文件:

terraform plan -target=data.hashicups_ingredients.first_coffee

同样,应用 使用 Terraform 的读取操作:

terraform apply -target=data.hashicups_ingredients.first_coffee -auto-approve