Terraform: terapkan hanya satu file tf


17

Saya memiliki grup keamanan saya di securitygroup.tffile.

Di dir yang sama ada banyak deskripsi sumber daya lainnya (rds, ec2 dll).

Apakah ada cara untuk melakukan terraform apply --auto-approve hanya untuk saya securitygroups.tf?

Jawaban:


19

Tidak juga. Cara standar untuk mengatasi ini adalah dengan menggunakan mis:

terraform apply -target=aws_security_group.my_sg

tetapi itu hanya akan menerapkan satu grup keamanan pada satu waktu, jadi akan membosankan jika Anda memiliki banyak dari mereka. Namun, Anda dapat menargetkan beberapa sumber daya dalam satu perintah:

terraform apply -target=aws_security_group.my_sg -target=aws_security_group.my_2nd_sg

Namun, ada beberapa solusi yang berpotensi:

  • The -targetparameter menghormati dependensi.

    Ini berarti jika Anda misalnya. -target=aws_instance.my_serverdan contoh itu telah, katakanlah, lima kelompok keamanan yang melekat padanya melalui interpolasi, perubahan pada kelompok - kelompok keamanan itu harus dimasukkan dalam rencana (saya belum benar-benar menguji ini, tapi saya percaya ini adalah cara kerjanya).

    Itu agak berantakan, karena Anda mungkin tidak ingin menyentuh contoh. Alternatif yang lebih aman mungkin menggunakan sesuatu seperti null_resourceuntuk memberikan target bagi kelompok keamanan, tapi sekali lagi saya belum mencoba ini (mungkin ada sumber daya 'aman' lain yang bisa Anda andalkan?).

  • Buat modul.

    Anda dapat menargetkan modul seperti halnya Anda dapat menargetkan sumber daya sederhana:

    terraform apply -target=module.my_security_groups
    

    Di dalam modul ini, Anda dapat mendefinisikan semua grup keamanan Anda - sama seperti yang Anda miliki di luar modul. Selain dapat menargetkannya secara langsung, ini juga memudahkan Anda menggunakan kembali kelompok keamanan yang sama untuk infrastruktur lain, jika perlu.


2

Jika Anda mengatur kode berdasarkan modul, Anda dapat menerapkan terraform hanya pada modul, misalnya:

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

$ tf apply -target=module.securitygroup

1

Sepertinya tidak mungkin. Berikut adalah kode untuk memuat file konfigurasi dan memuat semua file * .tf dari direktori saat ini (atau yang ditentukan) dan tidak ada yang membatasi konfigurasi untuk satu file.


0

Menggunakan modul terraform lebih disukai, tetapi jika Anda benar-benar harus menjalankan terraform berlaku terhadap satu file, saya membuat skrip bash ini untuk menghasilkan perintah terraform apply terhadap semua target dan modul dalam satu 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"

Saya bukan benar-benar pakar bash, tetapi itu diuji untuk bekerja pada Mac.

EDIT: Perintah sed mengasumsikan bahwa sumber daya dan modul diformat dengan baik menurut terraform fmt, seperti:

resource "aws_eip" "my_public_ip" {
}

resource "aws_instance" "my_server" {
}

module "my_module" {
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.