Terraform: применить только один файл TF

17

У меня есть группы безопасности в securitygroup.tfфайле.

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

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

pkaramol
источник

Ответы:

19

На самом деле, нет. Стандартный способ обойти это, хотя, например:

terraform apply -target=aws_security_group.my_sg

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

terraform apply -target=aws_security_group.my_sg -target=aws_security_group.my_2nd_sg

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

  • -targetПараметр уважает зависимости.

    Это означает, что если бы вы были, например. -target=aws_instance.my_serverи к этому экземпляру, скажем, пять групп безопасности, связанных с ним посредством интерполяции, изменения в этих группах безопасности должны быть включены в план (я не проверил это полностью, но я считаю, что так оно и работает).

    Это немного грязно, так как вы, вероятно, не хотите трогать экземпляр. Более безопасной альтернативой может быть использование чего-то вроде a null_resourceдля предоставления цели для групп безопасности, но опять же я не пробовал это (может быть, есть другой «безопасный» ресурс, на который вы могли бы положиться, хотя?).

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

    Вы можете настроить таргетинг на модуль так же, как и на обычный ресурс:

    terraform apply -target=module.my_security_groups
    

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

Тим Мэлоун
источник
2

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

# securitygroup.tf
module "securitygroup" {
  source = "git@github.com:user/securitygroup-terraform-module.git?ref=master"
}

$ tf apply -target=module.securitygroup
Antoine
источник
1

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

порыв
источник
0

Использование модуля terraform предпочтительнее, но если вам действительно нужно запустить terraform apply для одного файла, я сделал этот скрипт bash для генерации команды terraform apply для всех целей и модулей в одном файле:

#!/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"

Я не очень-то разбираюсь в bash, но его тестировали для работы на Mac.

РЕДАКТИРОВАТЬ: команда sed предполагает, что ресурсы и модули хорошо отформатированы в соответствии с terraform fmt:

resource "aws_eip" "my_public_ip" {
}

resource "aws_instance" "my_server" {
}

module "my_module" {
}
Permagate
источник