Câu trả lời:
Không hẳn vậy. Cách tiêu chuẩn để giải quyết vấn đề này là sử dụng, ví dụ:
terraform apply -target=aws_security_group.my_sg
nhưng điều đó sẽ chỉ áp dụng một nhóm bảo mật tại một thời điểm, vì vậy sẽ trở nên tẻ nhạt nếu bạn có nhiều nhóm. Tuy nhiên, bạn có thể nhắm mục tiêu nhiều tài nguyên trong một lệnh:
terraform apply -target=aws_security_group.my_sg -target=aws_security_group.my_2nd_sg
Tuy nhiên, có khả năng một vài cách giải quyết:
Các -target
tham số tôn trọng phụ thuộc.
Điều này có nghĩa là nếu bạn đã ví dụ. -target=aws_instance.my_server
và ví dụ đó, có năm nhóm bảo mật được đính kèm thông qua nội suy, những thay đổi đối với các nhóm bảo mật đó sẽ được đưa vào kế hoạch (Tôi chưa kiểm tra kỹ điều này, nhưng tôi tin rằng đây là cách nó hoạt động).
Đó là một chút lộn xộn, vì bạn có thể không muốn chạm vào một ví dụ. Một giải pháp thay thế an toàn hơn có thể là sử dụng thứ gì đó như null_resource
để cung cấp mục tiêu cho các nhóm bảo mật, nhưng một lần nữa tôi đã không thử điều này (có thể có một tài nguyên 'an toàn' khác mà bạn có thể dựa vào?).
Tạo một mô-đun.
Bạn có thể nhắm mục tiêu một mô-đun giống như bạn có thể nhắm mục tiêu tài nguyên đơn giản:
terraform apply -target=module.my_security_groups
Trong mô-đun này, bạn có thể xác định tất cả các nhóm bảo mật của mình - giống như bạn sẽ có bên ngoài mô-đun. Ngoài việc có thể nhắm mục tiêu trực tiếp vào nó, điều này cũng giúp bạn dễ dàng sử dụng lại cùng một nhóm các nhóm bảo mật cho cơ sở hạ tầng khác, nếu bạn cần.
Sử dụng mô-đun terraform được ưu tiên, nhưng nếu bạn thực sự phải chạy terraform áp dụng cho một tệp duy nhất, tôi đã tạo tập lệnh bash này để tạo lệnh áp dụng terraform đối với tất cả các mục tiêu và mô-đun trong một tệp:
#!/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"
Tôi không thực sự là chuyên gia bash, nhưng nó đã được thử nghiệm để hoạt động trên Mac.
EDIT: Lệnh sed giả định rằng các tài nguyên và mô-đun được định dạng độc đáo theo terraform fmt
, như vậy:
resource "aws_eip" "my_public_ip" {
}
resource "aws_instance" "my_server" {
}
module "my_module" {
}