如何将 .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
所有你需要做的:
- 进入各个文件夹
- terraform 初始化 && terraform 计划 && terraform 应用
- 输入 '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.tf
和 read.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
我是 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
所有你需要做的:
- 进入各个文件夹
- terraform 初始化 && terraform 计划 && terraform 应用
- 输入 '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.tf
和 read.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