Réponses:
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 -target
paramètre respecte les dépendances.
Cela signifie que si vous deviez par exemple. -target=aws_instance.my_server
et 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_resource
pour 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.
Ç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.
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" {
}