Terraform: appliquer un seul fichier tf

17

J'ai mes groupes de sécurité dans un securitygroup.tffichier.

Dans le même répertoire, il existe de nombreuses autres descriptions de ressources (rds, ec2, etc.).

Existe-t-il un moyen de réaliser un terraform apply --auto-approve seul pour moi securitygroups.tf?

pkaramol
la source

Réponses:

19

Pas vraiment. La manière standard de contourner ce problème est d'utiliser par exemple:

terraform apply -target=aws_security_group.my_sg

mais cela ne s'appliquera qu'à un seul groupe de sécurité à la fois, ce sera donc fastidieux si vous en avez beaucoup. Vous pouvez cependant cibler plusieurs ressources dans une seule commande:

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

Cependant, il existe potentiellement quelques solutions:

  • Le -targetparamètre respecte les dépendances.

    Cela signifie que si vous deviez par exemple. -target=aws_instance.my_serveret que cette instance avait, disons, cinq groupes de sécurité qui lui étaient attachés par interpolation, les changements à ces groupes de sécurité devraient être inclus dans le plan (je n'ai pas testé cela à fond, mais je crois que c'est ainsi que cela fonctionne).

    C'est un peu compliqué cependant, car vous ne voulez probablement pas toucher à une instance. Une alternative plus sûre pourrait être d'utiliser quelque chose comme un null_resourcepour fournir une cible aux groupes de sécurité, mais encore une fois, je n'ai pas essayé cela (il pourrait y avoir une autre ressource `` sûre '' sur laquelle vous pourriez compter, cependant?).

  • Créez un module.

    Vous pouvez cibler un module comme vous pouvez cibler une ressource ordinaire:

    terraform apply -target=module.my_security_groups
    

    À l'intérieur de ce module, vous pouvez définir tous vos groupes de sécurité - comme vous le feriez en dehors du module. En plus de pouvoir le cibler directement, cela vous permet également de réutiliser plus facilement le même ensemble de groupes de sécurité pour d'autres infrastructures, si vous en avez besoin.

Tim Malone
la source
2

Si vous organisez votre code par modules, vous pouvez appliquer la terraforme uniquement sur un module, par exemple:

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

$ tf apply -target=module.securitygroup
Antoine
la source
1

Ça ne semble pas possible. Voici le code pour charger les fichiers de configuration et il charge tous les fichiers * .tf du répertoire actuel (ou un répertoire spécifié) et il n'y a rien là pour limiter la configuration à un seul fichier.

se ruer
la source
0

L'utilisation du module terraform est préférable, mais si vous devez vraiment exécuter terraform apply sur un seul fichier, j'ai créé ce script bash pour générer la commande terraform apply sur toutes les cibles et tous les modules dans un seul fichier:

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

Je ne suis pas vraiment un expert bash, mais il a été testé pour fonctionner sur Mac.

EDIT: La commande sed suppose que les ressources et les modules sont bien formatés selon terraform fmt, comme ceci:

resource "aws_eip" "my_public_ip" {
}

resource "aws_instance" "my_server" {
}

module "my_module" {
}
Permagate
la source