Terraform 0.11 - Creating Modules

मॉड्यूल बनाना




terraform

मॉड्यूल बनाना

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

Terraform में मॉड्यूल Terraform फ़ाइलों के साथ फ़ोल्डर हैं। वास्तव में, जब आप terraform apply करते हैं, तो आपके द्वारा terraform apply की जा रही टेराफ़ॉर्म फ़ाइलों को धारण करने वाली वर्तमान कार्यशील निर्देशिका को रूट मॉड्यूल कहा जाता है। यह स्वयं एक मान्य मॉड्यूल है।

इसलिए, आप किसी भी मॉड्यूल के स्रोत में प्रवेश कर सकते हैं, किसी भी आवश्यक चर को संतुष्ट कर सकते हैं, terraform apply सकते हैं और काम करने की उम्मीद कर सकते हैं।

पुन: उपयोग के लिए बनाए गए मॉड्यूल मानक संरचना का पालन करना चाहिए। यह संरचना टूलरिंग रजिस्ट्री जैसे टूलिंग का निरीक्षण करने और दस्तावेज़ीकरण उत्पन्न करने, उदाहरण पढ़ने, और बहुत कुछ करने में सक्षम बनाती है।

एक उदाहरण मॉड्यूल

टेराफ़ॉर्म कॉन्फ़िगरेशन वाले फ़ोल्डर के भीतर, एक सबफ़ोल्डर बनाएं, जिसे child कहा जाता है। इस सबफ़ोल्डर में, एक खाली main.tf फ़ाइल main.tf । फिर, child फ़ोल्डर वाले रूट फ़ोल्डर में वापस, इसे अपनी टेराफ़ॉर्म कॉन्फ़िगरेशन फ़ाइलों में से एक में जोड़ें:

module "child" {
  source = "./child"
}

अब आपने अपना पहला मॉड्यूल बना लिया है! अब आप child मॉड्यूल में संसाधन जोड़ सकते हैं।

नोट: उपरोक्त चलाने से पहले, आपको अपने मॉड्यूल को सिंक करने के लिए टेराफॉर्म के लिए कमांड प्राप्त करना होगा। यह तत्काल होना चाहिए क्योंकि मॉड्यूल एक स्थानीय पथ है।

निवेश निर्गम

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

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

आइए हमारे child मॉड्यूल में एक चर और एक आउटपुट जोड़ें।

variable "memory" {}

output "received" {
  value = "${var.memory}"
}

यह एक आवश्यक चर, memory और फिर एक आउटपुट received करेगा, जो memory चर का मान होगा।

आप तब मॉड्यूल को कॉन्फ़िगर कर सकते हैं और आउटपुट का उपयोग कर सकते हैं:

module "child" {
  source = "./child"

  memory = "1G"
}

output "child_memory" {
  value = "${module.child.received}"
}

यदि आप अब terraform apply , तो आप देखते हैं कि यह कैसे काम करता है।

पथ और एंबेडेड फ़ाइलें

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

इन मामलों में, आप एक रिश्तेदार पथ का उपयोग नहीं कर सकते हैं, क्योंकि टेराफॉर्म में पथ आम तौर पर उस कार्यशील निर्देशिका के सापेक्ष होते हैं जहां से टेराफॉर्म को निष्पादित किया गया था। इसके बजाय, आप एक मॉड्यूल-सापेक्ष पथ का उपयोग करना चाहते हैं। ऐसा करने के लिए, आपको पथ प्रक्षेपित चर का उपयोग करना चाहिए।

resource "aws_instance" "server" {
  # ...

  provisioner "remote-exec" {
    script = "${path.module}/script.sh"
  }
}

यहां हम मॉड्यूल-सापेक्ष पथ प्राप्त करने के लिए ${path.module} का उपयोग करते हैं।

नेस्टेड मॉड्यूल

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

प्राप्त कमांड स्वचालित रूप से सभी नेस्टेड मॉड्यूल प्राप्त करेगा।

आपको मॉड्यूल के परस्पर विरोधी संस्करणों के बारे में चिंता करने की ज़रूरत नहीं है, क्योंकि टेराफ़ॉर्म सभी निर्भरताओं के पृथक उप-भाग बनाता है। उदाहरण के लिए, एक मॉड्यूल मॉड्यूल foo संस्करण 1.0 का उपयोग कर सकता है और दूसरा मॉड्यूल संस्करण 2.0 का उपयोग कर सकता है, और यह सभी Terraform के भीतर ठीक काम करेगा क्योंकि मॉड्यूल अलग से बनाए जाते हैं।

मानक मॉड्यूल संरचना

मानक मॉड्यूल संरचना एक फ़ाइल और फ़ोल्डर लेआउट है जिसे हम पुन: प्रयोज्य मॉड्यूल के लिए सुझाते हैं। Terraform टूलींग को मानक मॉड्यूल संरचना को समझने और रजिस्ट्री के लिए प्रलेखन, इंडेक्स मॉड्यूल को उत्पन्न करने के लिए उस संरचना का उपयोग करने के लिए बनाया गया है।

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

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

  • README रूट मॉड्यूल और किसी नेस्टेड मॉड्यूल में README फाइलें होनी चाहिए। इस फाइल का नाम README या README.md होना चाहिए। बाद को मार्कडाउन माना जाएगा। मॉड्यूल का विवरण होना चाहिए और इसका क्या उपयोग किया जाना चाहिए। यदि आप एक उदाहरण को शामिल करना चाहते हैं कि इस मॉड्यूल को अन्य संसाधनों के साथ कैसे उपयोग किया जा सकता है, तो इसे इस तरह के उदाहरण निर्देशिका में रखें । एक दृश्य आरेख पर विचार करें जिसमें बुनियादी ढांचे के संसाधनों का चित्रण हो सकता है जो मॉड्यूल बना सकता है और उनका संबंध। README को मॉड्यूल के इनपुट या आउटपुट को दस्तावेज करने की आवश्यकता नहीं है क्योंकि टूलिंग स्वचालित रूप से इसे उत्पन्न करेगा। यदि आप किसी फ़ाइल को लिंक कर रहे हैं या रिपॉजिटरी में निहित छवि को एम्बेड कर रहे हैं, तो कमिट-विशिष्ट निरपेक्ष URL का उपयोग करें ताकि लिंक भविष्य में किसी संसाधन के गलत संस्करण की ओर इंगित न करे।

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

  • main.tf, variables.tf, outputs.tf । ये कम से कम मॉड्यूल के लिए अनुशंसित फ़ाइल नाम हैं, भले ही वे खाली हों। main.tf प्राथमिक main.tf होना चाहिए। एक साधारण मॉड्यूल के लिए, यह वह जगह हो सकती है जहां सभी संसाधन बनाए जाते हैं। एक जटिल मॉड्यूल के लिए, संसाधन निर्माण को कई फ़ाइलों में विभाजित किया जा सकता है लेकिन सभी नेस्टेड मॉड्यूल उपयोग मुख्य फ़ाइल में होना चाहिए। variables.tf और outputs.tf क्रमशः वैरिएबल और आउटपुट के लिए घोषणाएं शामिल होनी चाहिए।

  • चर और आउटपुट में विवरण होना चाहिए। सभी चर और आउटपुट में एक या दो वाक्य विवरण होने चाहिए जो उनके उद्देश्य को स्पष्ट करें। यह प्रलेखन के लिए प्रयोग किया जाता है। अधिक विवरण के लिए variables और outputs लिए दस्तावेज़ देखें।

  • नेस्टेड मॉड्यूल । नेस्टेड मॉड्यूल modules/ उपनिर्देशिका के तहत मौजूद होना चाहिए। README.md साथ किसी भी नेस्टेड मॉड्यूल को बाहरी उपयोगकर्ता द्वारा उपयोग करने योग्य माना जाता है। यदि कोई README मौजूद नहीं है, तो इसे केवल आंतरिक उपयोग के लिए माना जाता है। ये विशुद्ध रूप से सलाहकार हैं; Terraform आंतरिक मॉड्यूल के उपयोग से सक्रिय रूप से इनकार नहीं करेगा। नेस्टेड मॉड्यूल का उपयोग जटिल व्यवहार को कई छोटे मॉड्यूल में विभाजित करने के लिए किया जाना चाहिए जिसे उन्नत उपयोगकर्ता सावधानीपूर्वक चुन सकते हैं और चुन सकते हैं। उदाहरण के लिए, कॉन्सल मॉड्यूल में क्लस्टर बनाने के लिए एक नेस्टेड मॉड्यूल है जो मॉड्यूल से आवश्यक IAM नीतियों को सेटअप करने के लिए अलग है। यह एक उपयोगकर्ता को अपनी स्वयं की IAM नीति विकल्पों में लाने की अनुमति देता है।

  • उदाहरण । मॉड्यूल का उपयोग करने के examples/ रिपॉजिटरी की जड़ में examples/ उपनिर्देशिका के तहत मौजूद होना चाहिए। उदाहरण के लक्ष्य और उपयोग को समझाने के लिए प्रत्येक उदाहरण में एक README हो सकता है। सबमॉड्यूल्स के उदाहरणों को मूल examples/ निर्देशिका में भी रखा जाना चाहिए।

मानक संरचना के बाद एक न्यूनतम अनुशंसित मॉड्यूल नीचे दिखाया गया है। जबकि रूट मॉड्यूल केवल आवश्यक तत्व है, हम न्यूनतम के रूप में नीचे की संरचना की सलाह देते हैं:

$ tree minimal-module/
.
├── README.md
├── main.tf
├── variables.tf
├── outputs.tf

मानक संरचना का पालन करने वाले एक मॉड्यूल का पूरा उदाहरण नीचे दिखाया गया है। इस उदाहरण में सभी वैकल्पिक तत्व शामिल हैं और इसलिए सबसे जटिल एक मॉड्यूल बन सकता है:

$ tree complete-module/
.
├── README.md
├── main.tf
├── variables.tf
├── outputs.tf
├── ...
├── modules/
│   ├── nestedA/
│   │   ├── README.md
│   │   ├── variables.tf
│   │   ├── main.tf
│   │   ├── outputs.tf
│   ├── nestedB/
│   ├── .../
├── examples/
│   ├── exampleA/
│   │   ├── main.tf
│   ├── exampleB/
│   ├── .../

प्रकाशन मॉड्यूल

यदि आपने एक ऐसा मॉड्यूल बनाया है, जिसका आप पुन: उपयोग करने का इरादा रखते हैं, तो हम मॉड्यूल को टेराफॉर्म रजिस्ट्री पर प्रकाशित करने की सलाह देते हैं। यह आपके मॉड्यूल को संस्करण देगा, प्रलेखन उत्पन्न करेगा, और बहुत कुछ।

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

module "consul" {
  source = "hashicorp/consul/aws"
}

आप निजी रजिस्ट्री के लिए साइन अप करके निजी मॉड्यूल के लिए रजिस्ट्री के सभी लाभ भी प्राप्त कर सकते हैं।