Terraform: केवल एक tf फ़ाइल लागू करें


17

मेरे पास एक securitygroup.tfफ़ाइल में मेरे सुरक्षा समूह हैं ।

एक ही dir में अन्य संसाधन विवरण (rds, ec2 etc) बहुत सारे हैं।

क्या मेरे लिए terraform apply --auto-approve केवल प्रदर्शन करने का एक तरीका है securitygroups.tf?

जवाबों:


19

ज़रुरी नहीं। मानक तरीके से इसके आसपास काम करना है, हालांकि इसका उपयोग करना है:

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
    

    इस मॉड्यूल के अंदर, आप अपने सभी सुरक्षा समूहों को परिभाषित कर सकते हैं - जैसे आप मॉड्यूल के बाहर होंगे। साथ ही इसे सीधे लक्षित करने में सक्षम होने के कारण, इससे आपको कभी भी ज़रूरत पड़ने पर अन्य अवसंरचना के लिए सुरक्षा समूहों के समान सेट का फिर से उपयोग करना आसान हो जाता है।


2

यदि आप मॉड्यूल द्वारा अपना कोड व्यवस्थित करते हैं, तो आप केवल एक मॉड्यूल पर टेराफ़ॉर्म लागू कर सकते हैं, जैसे:

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

$ tf apply -target=module.securitygroup

1

ऐसा नहीं लगता कि यह संभव है। यहाँ विन्यास फाइल लोड करने के लिए कोड है और यह सभी * .tf फ़ाइलों को वर्तमान निर्देशिका (या निर्दिष्ट एक) से लोड करता है और कॉन्फ़िगरेशन को एक फ़ाइल में सीमित करने के लिए कुछ भी नहीं है।


0

टेराफ़ॉर्म मॉड्यूल का उपयोग करना पसंद किया जाता है, लेकिन अगर आपको वास्तव में किसी एक फ़ाइल के विरुद्ध टेराफ़ॉर्म लागू करना है, तो मैंने इस बैश स्क्रिप्ट को एक फ़ाइल में सभी लक्ष्यों और मॉड्यूलों के विरुद्ध टेराफ़ॉर्म लागू कमांड बनाने के लिए बनाया है:

#!/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" {
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.