Terraform: Применить Только Один Файл Tf

  • Автор темы B234CH
  • Обновлено
  • 22, Oct 2024
  • #1

У меня есть группы безопасности в securitygroups.tf file.

В том же каталоге есть множество других описаний ресурсов (rds, ec2 и т. д.).

Есть ли способ выполнить terraform apply --auto-approve только для моего securitygroup.tf ?

#терраформировать

B234CH


Рег
27 Aug, 2022

Тем
77

Постов
184

Баллов
609
  • 25, Oct 2024
  • #2

Не совсем. Стандартный способ обойти это - использовать, например:

 
 
 
 
 
 
 
 
 
 
 
 
 
 terraform apply -auto-approve
 

но одновременно будет применяться только одна группа безопасности, поэтому это будет утомительно, если у вас их много. Однако вы можете настроить несколько ресурсов с помощью одной команды:

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

Однако потенциально есть несколько обходных путей:

  • 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 } parameter respects dependencies.

    Это означает, что если бы вы, например. terraform apply -auto-approve and that instance had, say, five security groups attached to it via interpolation, changes to those security groups должен быть включен в план (я не проверял это тщательно, но думаю, что именно так это и работает).

    Однако это немного запутанно, поскольку вы, вероятно, не захотите трогать экземпляр. Более безопасной альтернативой может быть использование чего-то вроде # 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" # } чтобы предоставить цель группам безопасности, но, опять же, я не пробовал этого (хотя может быть другой «безопасный» ресурс, на который вы могли бы положиться?).

  • Создайте модуль.

    Вы можете настроить таргетинг на модуль точно так же, как вы можете настроить таргетинг на простой ресурс (не забудьте заключить имя цели в кавычки):

    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 }

    Внутри этого модуля вы можете определить все свои группы безопасности точно так же, как и вне модуля. Помимо возможности напрямую нацеливаться на него, это также упрощает повторное использование одного и того же набора групп безопасности для другой инфраструктуры, если вам когда-нибудь понадобится.

 

Nela


Рег
28 Mar, 2007

Тем
71

Постов
159

Баллов
524
  • 25, Oct 2024
  • #3

Если вы организуете свой код по модулям, вы можете применить terraform только к модулю, например:

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

Не похоже, что это возможно. Вот код для загрузки файлов конфигурации, и он загружает все файлы *.tf из текущего каталога (или указанного), и там нет ничего, что могло бы ограничить конфигурацию одним файлом.

 

Vodka-HzO


Рег
05 Nov, 2008

Тем
64

Постов
215

Баллов
565
  • 25, Oct 2024
  • #4

Использование модуля 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

Таким образом, вы можете подать заявку конкретный код с закомментировать и раскомментировать.

 

Tinitus


Рег
14 Nov, 2010

Тем
73

Постов
193

Баллов
608
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно