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" {
}