Использование модуля terraform предпочтительнее, но если вам действительно нужно запустить terraform apply для одного файла, я создал этот bash-скрипт для генерации команды terraform apply для всех целей и модулей в одном файле:
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
}
Я не совсем эксперт по Bash, но он был протестирован на Mac.
РЕДАКТИРОВАТЬ: Команда sed предполагает, что ресурсы и модули правильно отформатированы в соответствии с resource "aws_eip" "my_public_ip" {
}
resource "aws_instance" "my_server" {
}
module "my_module" {
}
like so:
terraform fmt
||answer||
Нет, к сожалению, Терраформировать не имеет возможности применить конкретный файл .tf. Терраформировать применяется все файлы .tf в том же каталоге.
Но вы можете подать заявку конкретный код с закомментировать и раскомментировать. Например, у вас есть 2 файла .tf. "1ст.тф" и "2-й.тф" в том же каталоге, чтобы создать ресурсы для GCP (Облачная платформа Google):
Затем, "1ст.тф" имеет этот код ниже:
#!/usr/bin/env bash
if [[ -z "$@" ]]; then
echo "Missing file input arguments"
exit 1
fi
echo "terraform apply \\"
for FILE in "$@"
do
RESOURCE=$(sed -n 's/resource "\([^"]*\)" "\([^"]*\)".*/-target=\1.\2 \\/gp' $FILE)
MODULE=$(sed -n 's/module "\([^"]*\)".*/-target=module.\1 \\/gp' $FILE)
if [[ -z "$RESOURCE" ]] && [[ -z "$MODULE" ]]; then
echo "Cannot detect terraform resource and module in $FILE"
exit 1
fi
if [[ ! -z "$RESOURCE" ]]; then
echo -e $"$RESOURCE"
fi
if [[ ! -z "$MODULE" ]]; then
echo -e $"$MODULE"
fi
done
echo "-refresh=true"
И "2nd.tf" имеет этот код ниже:
# securitygroup.tf
module "securitygroup" {
source = "[email protected]:user/securitygroup-terraform-module.git?ref=master"
}
$ tf apply -target=module.securitygroup
Теперь, во-первых, вы хотите применить только код в "1ст.тф" так что тебе нужно закомментировать код в "2nd.tf":
1-й.тф:
terraform apply -target="module.my_security_groups"
2nd.tf (комментарий):
null_resource
Затем вы применяете:
-target=aws_instance.my_server
Далее, дополнительно, вы хотите применить код в "2nd.tf" так что тебе нужно раскомментировать код в "2nd.tf":
1-й.тф:
-target
2nd.tf (Раскомментировать):
terraform apply -target=aws_security_group.my_sg -target=aws_security_group.my_2nd_sg
Затем вы применяете:
terraform apply -target=aws_security_group.my_sg
Таким образом, вы можете подать заявку конкретный код с закомментировать и раскомментировать.