जवाबों:
ज़रुरी नहीं। मानक तरीके से इसके आसपास काम करना है, हालांकि इसका उपयोग करना है:
terraform apply -target=aws_security_group.my_sg
लेकिन यह केवल एक ही समय में एक सुरक्षा समूह को लागू करने जा रहा है, इसलिए यदि आप उनमें से बहुत से हैं तो थकाऊ हो जाएंगे। हालाँकि, आप एक कमांड में कई संसाधनों को लक्षित कर सकते हैं:
terraform apply -target=aws_security_group.my_sg -target=aws_security_group.my_2nd_sg
हालांकि, संभावित रूप से कुछ जोड़े हैं:
-target
पैरामीटर निर्भरता सम्मान करता है।
इसका मतलब है अगर आप उदाहरण के लिए थे। -target=aws_instance.my_server
और उदाहरण के अनुसार, पांच सुरक्षा समूहों ने इसे प्रक्षेप के माध्यम से जोड़ा था, उन सुरक्षा समूहों में परिवर्तन को योजना में शामिल किया जाना चाहिए (मैंने इसे पूरी तरह से परीक्षण नहीं किया है, लेकिन मेरा मानना है कि यह कैसे काम करता है)।
हालांकि यह थोड़ा गड़बड़ है, क्योंकि आप शायद एक उदाहरण को छूना नहीं चाहते हैं। एक सुरक्षित विकल्प null_resource
सुरक्षा समूहों के लिए एक लक्ष्य प्रदान करने के लिए एक जैसे कुछ का उपयोग कर सकता है , लेकिन फिर भी मैंने यह कोशिश नहीं की है (हालांकि एक और 'सुरक्षित' संसाधन हो सकता है जिस पर आप भरोसा कर सकते हैं, हालांकि?)।
एक मॉड्यूल बनाएँ।
आप एक मॉड्यूल को वैसे ही लक्षित कर सकते हैं जैसे आप एक सादे संसाधन को लक्षित कर सकते हैं:
terraform apply -target=module.my_security_groups
इस मॉड्यूल के अंदर, आप अपने सभी सुरक्षा समूहों को परिभाषित कर सकते हैं - जैसे आप मॉड्यूल के बाहर होंगे। साथ ही इसे सीधे लक्षित करने में सक्षम होने के कारण, इससे आपको कभी भी ज़रूरत पड़ने पर अन्य अवसंरचना के लिए सुरक्षा समूहों के समान सेट का फिर से उपयोग करना आसान हो जाता है।
टेराफ़ॉर्म मॉड्यूल का उपयोग करना पसंद किया जाता है, लेकिन अगर आपको वास्तव में किसी एक फ़ाइल के विरुद्ध टेराफ़ॉर्म लागू करना है, तो मैंने इस बैश स्क्रिप्ट को एक फ़ाइल में सभी लक्ष्यों और मॉड्यूलों के विरुद्ध टेराफ़ॉर्म लागू कमांड बनाने के लिए बनाया है:
#!/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"
मैं वास्तव में बैश विशेषज्ञ नहीं हूं, लेकिन मैक पर काम करने के लिए यह परीक्षण किया गया था।
EDIT: सेड कमांड यह मानती है कि संसाधनों और मॉड्यूल को अच्छी तरह से स्वरूपित किया गया है terraform fmt
, जैसे:
resource "aws_eip" "my_public_ip" {
}
resource "aws_instance" "my_server" {
}
module "my_module" {
}