17

I'm a beginner in Terraform.

I have a directory which contains 2 .tf files.

Now I want to run Terraform Apply on a selected .tf file & neglect the other one.

Can I do that? If yes, how? If no, why & what is the best practice?

4

7 回答 7

18

You can't selectively apply one file and then the other. Two ways of (maybe) achieving what you're going for:

  • Use the -target flag to target resource(s) in one file and then the other.
  • Put each file (or more broadly, group of resources, which might be multiple files) in separate "modules" (folders). You can then apply them separately.
于 2017-12-08T06:15:54.137 回答
8

You can use the terraform -target flag. Or You can have multiple terraform modules in a separate directory. And then you can terraform apply there. As an example, assume you have 3 .tf files separately. But you need to run more than just one of them at the same time. If you also, need to run them more often it's better to have a terraform module.

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

Inside the module.tf you can define which files you need to apply.

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

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

Then issue terraform apply staying at the module directory. And it will automatically import instances inside those paths and apply it.

于 2019-01-28T09:06:07.620 回答
5

Putting each terraform config file into separate directory did the job correctly. So here, is my structure

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

All you have to do:

  1. enter each folder
  2. terraform init && terraform plan && terraform apply
  3. enter 'yes' to confirm terraform apply

PS: '-target' key didn't help me out.

于 2018-11-06T16:01:56.970 回答
2

Either use a --target option to specify module to run by using below command

terraform apply -target=module.<module_name>

Or another workaround is rename other terraform files with *.tf.disable extension to skip it by loading via Terraform. Currently it's Code loading *.tf files

于 2019-07-09T06:25:27.290 回答
0

No, unfortunately, Terraform doesn't have the feature to apply a selected .tf file. Terraform applies all .tf files in the same directory.

But you can apply the selected code with comment out and uncomment. For example, you have 2 .tf files "1st.tf" and "2nd.tf" in the same directory to create the resources for GCP(Google Cloud Platform):

enter image description here

Then, "1st.tf" has this code below:

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
}

And "2nd.tf" has this code below:

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

Now, first, you want to only apply the code in "1st.tf" so you need to comment out the code in "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 (Comment Out):

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

Then, you apply:

terraform apply -auto-approve

Next, additionally, you want to apply the code in "2nd.tf" so you need to uncomment the code in "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 (Uncomment):

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

Then, you apply:

terraform apply -auto-approve

This way, you can apply the selected code with comment out and uncomment.

于 2022-01-31T21:32:14.750 回答
0

If you cant have terraform files in different folders like the other answers stated. You can try using my script GitHub repo for script

Which is a script that runs throughout a specific terraform file and outputs adds "-target=" to all modules names.

于 2022-02-10T13:51:30.027 回答
0
terraform apply -target nginx-docker.tf
于 2022-02-11T20:39:31.950 回答