Yanıtlar:
Pek sayılmaz. Bu sorunu aşmanın standart yolu, örneğin:
terraform apply -target=aws_security_group.my_sg
ancak bu bir seferde yalnızca bir güvenlik grubu uygulayacaktır, bu yüzden çok fazla varsa sıkıcı olacaktır. Ancak, tek bir komutta birden fazla kaynağı hedefleyebilirsiniz:
terraform apply -target=aws_security_group.my_sg -target=aws_security_group.my_2nd_sg
Ancak, potansiyel olarak birkaç geçici çözüm vardır:
-target
Parametre bağımlılıkları uyar.
Bu, örneğin; -target=aws_instance.my_server
ve bu örnek, örneğin, enterpolasyon yoluyla kendisine bağlı beş güvenlik grubuna sahipti, bu güvenlik gruplarındaki değişiklikler plana dahil edilmelidir (bunu tam olarak test etmedim, ancak bunun nasıl çalıştığına inanıyorum).
Muhtemelen bir örneğe dokunmak istemediğiniz için bu biraz dağınık. Daha güvenli bir alternatif null_resource
, güvenlik grupları için bir hedef sağlamak için a gibi bir şey kullanıyor olabilir , ancak yine de bunu denemedim (yine de güvenebileceğiniz başka bir 'güvenli' kaynak olabilir mi?).
Bir modül oluşturun.
Bir modülü tıpkı düz bir kaynağı hedefleyebileceğiniz gibi hedefleyebilirsiniz:
terraform apply -target=module.my_security_groups
Bu modülün içinde, tıpkı modülün dışında olduğu gibi, tüm güvenlik gruplarınızı tanımlayabilirsiniz. Bu, doğrudan hedefleyebilmenin yanı sıra, ihtiyacınız olduğunda, aynı altyapı gruplarını diğer altyapı için yeniden kullanmanızı da kolaylaştırır.
Terraform modülünü kullanmak tercih edilir, ancak terraform uygulamasını tek bir dosyaya karşı uygulamanız gerekiyorsa, bu bash betiğini tek bir dosyadaki tüm hedeflere ve modüllere karşı terraform uygulama komutu oluşturmak için yaptım:
#!/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"
Gerçekten bash uzmanı değilim, ancak Mac üzerinde çalıştığı test edildi.
EDIT: sed komutu, kaynakların ve modüllerin aşağıdaki terraform fmt
gibi güzel bir şekilde biçimlendirildiğini varsayar :
resource "aws_eip" "my_public_ip" {
}
resource "aws_instance" "my_server" {
}
module "my_module" {
}