Risposte:
Non proprio. Il modo standard per aggirare questo problema è usare ad esempio:
terraform apply -target=aws_security_group.my_sg
ma questo applicherà solo un gruppo di sicurezza alla volta, quindi diventeremo noioso se ne hai molti. Tuttavia, puoi indirizzare più risorse in un solo comando:
terraform apply -target=aws_security_group.my_sg -target=aws_security_group.my_2nd_sg
Tuttavia, esistono potenzialmente un paio di soluzioni alternative:
Il -target
parametro rispetta le dipendenze.
Questo significa che se dovessi es. -target=aws_instance.my_server
e quell'istanza aveva, per esempio, cinque gruppi di sicurezza ad esso collegati tramite interpolazione, le modifiche a quei gruppi di sicurezza dovevano essere incluse nel piano (non l'ho verificato a fondo, ma credo che sia così che funziona).
Questo è un po 'disordinato, poiché probabilmente non vuoi toccare un'istanza. Un'alternativa più sicura potrebbe essere usare qualcosa di simile null_resource
a un obiettivo per i gruppi di sicurezza, ma ancora una volta non ho provato questo (potrebbe esserci un'altra risorsa "sicura" su cui fare affidamento, però?).
Crea un modulo.
Puoi scegliere come target un modulo proprio come puoi scegliere come target una risorsa semplice:
terraform apply -target=module.my_security_groups
All'interno di questo modulo, è possibile definire tutti i gruppi di sicurezza, proprio come si farebbe al di fuori del modulo. Oltre a essere in grado di indirizzarlo direttamente, ciò semplifica anche il riutilizzo dello stesso gruppo di gruppi di sicurezza per altre infrastrutture, se necessario.
Non sembra possibile. Ecco il codice per caricare i file di configurazione e carica tutti i file * .tf dalla directory corrente (o uno specificato) e non c'è nulla per limitare la configurazione a un singolo file.
L'utilizzo del modulo terraform è preferito, ma se devi davvero eseguire terraform apply su un singolo file, ho creato questo script bash per generare il comando terraform apply su tutti i target e i moduli in un unico file:
#!/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"
Non sono un vero esperto di base, ma è stato testato per funzionare su Mac.
EDIT: il comando sed presuppone che le risorse e i moduli siano formattati correttamente in base a terraform fmt
, in questo modo:
resource "aws_eip" "my_public_ip" {
}
resource "aws_instance" "my_server" {
}
module "my_module" {
}