Saya memiliki grup keamanan saya di securitygroup.tf
file.
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
?
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 -target
parameter menghormati dependensi.
Ini berarti jika Anda misalnya. -target=aws_instance.my_server
dan 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_resource
untuk 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.
Jika Anda mengatur kode berdasarkan modul, Anda dapat menerapkan terraform hanya pada modul, misalnya:
# securitygroup.tf
module "securitygroup" {
source = "[email protected]:user/securitygroup-terraform-module.git?ref=master"
}
$ tf apply -target=module.securitygroup
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.
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" {
}