Terraform: zastosuj tylko jeden plik tf

17

Mam swoje grupy zabezpieczeń w securitygroup.tfpliku.

W tym samym katalogu znajduje się wiele innych opisów zasobów (rds, ec2 itp.).

Czy istnieje sposób na wykonanie terraform apply --auto-approve tylko dla mnie securitygroups.tf?

pkaramol
źródło

Odpowiedzi:

19

Nie całkiem. Standardowym sposobem obejścia tego jest jednak użycie np .:

terraform apply -target=aws_security_group.my_sg

ale będzie to dotyczyło tylko jednej grupy zabezpieczeń naraz, więc stanie się nudne, jeśli będzie ich dużo. Możesz jednak celować w wiele zasobów za pomocą jednego polecenia:

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

Istnieje jednak potencjalnie kilka obejść:

  • -targetParametr szanuje zależności.

    Oznacza to, że gdybyś np. -target=aws_instance.my_serveri w tym przypadku, powiedzmy, pięć grup bezpieczeństwa dołączonych do niego przez interpolację, zmiany w tych grupach zabezpieczeń powinny zostać uwzględnione w planie (nie testowałem tego dokładnie, ale wierzę, że tak to działa).

    Jest to trochę bałagan, ponieważ prawdopodobnie nie chcesz dotknąć instancji. Bezpieczniejszą alternatywą może być użycie czegoś w rodzaju a, null_resourceaby zapewnić cel grupom bezpieczeństwa, ale znowu nie próbowałem tego (może być jednak inny „bezpieczny” zasób, na którym można polegać?).

  • Utwórz moduł.

    Możesz kierować na moduł tak samo, jak na zwykły zasób:

    terraform apply -target=module.my_security_groups
    

    Wewnątrz tego modułu można zdefiniować wszystkie grupy zabezpieczeń - tak samo, jak na zewnątrz modułu. Oprócz możliwości bezpośredniego ukierunkowania, ułatwia to ponowne użycie tego samego zestawu grup zabezpieczeń dla innej infrastruktury, jeśli zajdzie taka potrzeba.

Tim Malone
źródło
2

Jeśli organizujesz swój kod według modułów, możesz zastosować terraform tylko na module, np .:

# securitygroup.tf
module "securitygroup" {
  source = "[email protected]:user/securitygroup-terraform-module.git?ref=master"
}

$ tf apply -target=module.securitygroup
Antoine
źródło
1

Nie wygląda na to, żeby było możliwe. Oto kod do ładowania plików konfiguracyjnych i ładuje wszystkie pliki * .tf z bieżącego katalogu (lub określonego) i nic nie ogranicza konfiguracji do jednego pliku.

wysypka
źródło
0

Preferowany jest moduł terraform, ale jeśli naprawdę musisz uruchomić program Terraform Apply na pojedynczym pliku, stworzyłem ten skrypt bash, aby wygenerować polecenie Apply Terraform dla wszystkich obiektów docelowych i modułów w jednym pliku:

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

Nie jestem ekspertem od bash, ale został przetestowany do pracy na Macu.

EDYCJA: Komenda sed zakłada, że ​​zasoby i moduły są ładnie sformatowane zgodnie z terraform fmt:

resource "aws_eip" "my_public_ip" {
}

resource "aws_instance" "my_server" {
}

module "my_module" {
}
Permagate
źródło