मेरे पास निम्न फ़ोल्डर संरचना है:

infrastructure
└───security-groups
│   │   main.tf
│   │   config.tf
│   │.  security_groups.tf
│   
└───instances
    │   main.tf
    │   config.tf
    │   instances.tf

मैं संदर्भ द्वारा सुरक्षा-समूह फ़ोल्डर में तत्काल सुरक्षा समूह आईडी का संदर्भ देना चाहता हूं। मैंने security_groups.tf फ़ाइल में आवश्यक आईडी को आउटपुट करने का प्रयास किया है

output "sg_id" {
  value = "${aws_security_group.server_sg.id}"
}

और फिर उदाहरणों में फ़ाइल इसे मॉड्यूल के रूप में जोड़ें:

module "res" {
  source = "../security-groups"
}

इस दृष्टिकोण के साथ समस्या यह है कि जब मैं इंस्टेंस फ़ोल्डर में टेराफॉर्म लागू करता हूं, तो यह सुरक्षा समूह भी बनाने की कोशिश करता है (जिसे मैंने पहले ही टेराफॉर्म करके सुरक्षा-समूह फ़ोल्डर में लागू किया है) और यह विफल हो जाता है क्योंकि एसजी हैं विद्यमान।

कोड की संरचना को बदले बिना किसी भिन्न फ़ोल्डर में बनाए गए संसाधनों को संदर्भित करने का सबसे आसान तरीका क्या होगा?

धन्यवाद।

3
madu 28 सितंबर 2020, 04:52

2 जवाब

सबसे बढ़िया उत्तर

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

data "aws_security_group" "sg" {
  name = "the-security-group-name"
}

अपने इंस्टेंस फ़ोल्डर में, और अपने इंस्टेंस को उस सुरक्षा समूह के साथ संबद्ध करने के लिए उस निकाय का संदर्भ लें।

आपको यह भी विचार करना चाहिए कि क्या आप वास्तव में केवल प्रत्येक फ़ोल्डर के बजाय पूरे पेड़ पर टेराफॉर्म लागू करना चाहते हैं। फिर आप अपने सभी प्रबंधित संसाधनों के बीच सीधे संदर्भित कर सकते हैं जैसे आप करने का प्रयास कर रहे हैं, और आपको terraform apply को कई बार कॉल करने की आवश्यकता नहीं है।

4
lxop 28 सितंबर 2020, 06:36

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

data "terraform_remote_state" "sg" {
  backend = "local"

  config = {
    path = "../security-groups/terraform.tfstate"
  }
}

और फिर उदा। का उपयोग करके इसका संदर्भ लें।

locals {
  sgId = data.terraform_remote_state.sg.outputs.sg_id
}
0
skoll 7 अक्टूबर 2021, 09:54