Terraform: Wende nur eine tf-Datei an


16

Ich habe meine Sicherheitsgruppen in einer securitygroup.tfDatei.

In der gleichen Richtung gibt es viele andere Ressourcenbeschreibungen (rds, ec2 usw.).

Gibt es eine Möglichkeit, eine terraform apply --auto-approve nur für mich durchzuführen securitygroups.tf?

Antworten:


18

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 -targetParameter berücksichtigt Abhängigkeiten.

    Dies bedeutet, wenn Sie z. -target=aws_instance.my_serverund 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.


2

Wenn Sie Ihren Code nach Modulen organisieren, können Sie terraform nur auf ein Modul anwenden, z.

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

$ tf apply -target=module.securitygroup

1

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.


0

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" {
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.