Terraform: sadece bir tf dosyası uygulayın


17

Güvenlik gruplarým securitygroup.tfdosyada var.

Aynı kitapta başka kaynak tanımları da vardır (rds, ec2 vb.).

terraform apply --auto-approve Sadece benim için yapmanın bir yolu var mı securitygroups.tf?

Yanıtlar:


19

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:

  • -targetParametre bağımlılıkları uyar.

    Bu, örneğin; -target=aws_instance.my_serverve 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.


2

Kodunuzu modüllere göre düzenlerseniz, terraform'u yalnızca bir modüle uygulayabilirsiniz, örneğin:

# securitygroup.tf
module "securitygroup" {
  source = "git@github.com:user/securitygroup-terraform-module.git?ref=master"
}

$ tf apply -target=module.securitygroup

1

Mümkün gibi görünmüyor. Yapılandırma dosyalarını yüklemek için kod ve tüm * .tf dosyalarını geçerli dizinden (veya belirtilen bir dosyadan) yükler ve yapılandırmayı tek bir dosyayla sınırlayacak hiçbir şey yoktur.


0

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 fmtgibi güzel bir şekilde biçimlendirildiğini varsayar :

resource "aws_eip" "my_public_ip" {
}

resource "aws_instance" "my_server" {
}

module "my_module" {
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.