Antworten:
Nicht wirklich. Die Standardmethode, um dies zu umgehen, ist zB:
terraform apply -target=aws_security_group.my_sg
Es wird jedoch immer nur eine Sicherheitsgruppe gleichzeitig angewendet. Wenn Sie also über viele Sicherheitsgruppen verfügen, wird dies langweilig. Sie können jedoch mehrere Ressourcen in einem Befehl anvisieren:
terraform apply -target=aws_security_group.my_sg -target=aws_security_group.my_2nd_sg
Es gibt jedoch möglicherweise ein paar Problemumgehungen:
Der -target
Parameter berücksichtigt Abhängigkeiten.
Dies bedeutet, wenn Sie z. -target=aws_instance.my_server
und dieser Instanz waren beispielsweise fünf Sicherheitsgruppen über Interpolation zugeordnet. Änderungen an diesen Sicherheitsgruppen sollten in den Plan aufgenommen werden (ich habe das nicht gründlich getestet, aber ich glaube, dass es so funktioniert).
Das ist allerdings etwas chaotisch, da Sie wahrscheinlich keine Instanz berühren möchten. Eine sicherere Alternative könnte sein, dass Sie so etwas wie a verwenden null_resource
, um ein Ziel für die Sicherheitsgruppen bereitzustellen, aber auch dies habe ich nicht ausprobiert (es könnte jedoch eine andere "sichere" Ressource geben, auf die Sie sich verlassen können?).
Erstellen Sie ein Modul.
Sie können ein Modul genau wie eine einfache Ressource als Ziel festlegen:
terraform apply -target=module.my_security_groups
In diesem Modul können Sie alle Ihre Sicherheitsgruppen definieren - genau wie außerhalb des Moduls. Dies erleichtert Ihnen nicht nur die direkte Ausrichtung, sondern auch die Wiederverwendung derselben Sicherheitsgruppen für andere Infrastrukturen, falls dies jemals erforderlich sein sollte.
Sieht nicht so aus, als wäre es möglich. Hier ist der Code zum Laden von Konfigurationsdateien. Er lädt alle * .tf-Dateien aus dem aktuellen Verzeichnis (oder einem angegebenen) und es gibt nichts, was die Konfiguration auf eine einzelne Datei beschränken könnte.
Die Verwendung des terraform-Moduls wird bevorzugt, aber wenn Sie terraform apply wirklich für eine einzelne Datei ausführen müssen, habe ich dieses Bash-Skript erstellt, um den terraform apply-Befehl für alle Ziele und Module in einer Datei zu generieren:
#!/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"
Ich bin kein wirklicher Bash-Experte, aber es wurde getestet, um auf einem Mac zu funktionieren.
BEARBEITEN: Der sed-Befehl setzt voraus, dass die Ressourcen und Module folgendermaßen formatiert sind terraform fmt
:
resource "aws_eip" "my_public_ip" {
}
resource "aws_instance" "my_server" {
}
module "my_module" {
}