Terraform 0.11 - Internal Plugins

आंतरिक प्लगइन्स




terraform

आंतरिक प्लगइन्स

Terraform प्रदाताओं और प्रावधानों को प्लगइन्स के माध्यम से प्रदान किया जाता है। प्रत्येक प्लगइन एक विशिष्ट सेवा के लिए एक कार्यान्वयन प्रदान करता है, जैसे AWS, या प्रावधानकर्ता, जैसे बैश। प्लगइन्स को एक अलग प्रक्रिया के रूप में निष्पादित किया जाता है और एक आरपीसी इंटरफ़ेस पर मुख्य टेराफॉर्म बाइनरी के साथ संवाद करता है।

0.7 से पहले के संस्करणों से उन्नयन

0.7 से पहले टेराफॉर्म के संस्करणों में, प्रत्येक प्लगइन को एक अलग बाइनरी के रूप में भेजा गया। टेराफॉर्म> = 0.7 के संस्करणों में, सभी आधिकारिक प्लगइन्स को एकल बाइनरी के रूप में शिप किया जाता है। यह बहुत सारे डिस्क स्थान बचाता है और आपके लिए डाउनलोड तेजी से बनाता है!

हालाँकि, जब आप अपग्रेड करते हैं तो आपको डिस्क से पुराने प्लगइन्स को मैन्युअल रूप से हटाना होगा। आप कुछ इस तरह से कर सकते हैं, जहां आप terraform स्थापित करते हैं, इस पर निर्भर करता है:

rm /usr/local/bin/terraform-*

यदि आप ऐसा नहीं करते हैं, तो आपको निम्नलिखित की तरह एक त्रुटि संदेश दिखाई देगा:

[WARN] /usr/local/bin/terraform-provisioner-file overrides an internal plugin for file-provisioner.
  If you did not expect to see this message you will need to remove the old plugin.
  See https://www.terraform.io/docs/internals/plugins.html
Error configuring: 2 error(s) occurred:

* Unrecognized remote plugin message: 2|unix|/var/folders/pj/66q7ztvd17v_vgfg8c99gm1m0000gn/T/tf-plugin604337945

This usually means that the plugin is either invalid or simply
needs to be recompiled to support the latest protocol.
* Unrecognized remote plugin message: 2|unix|/var/folders/pj/66q7ztvd17v_vgfg8c99gm1m0000gn/T/tf-plugin647987867

This usually means that the plugin is either invalid or simply
needs to be recompiled to support the latest protocol.

ऐसा क्यों होता है?

Terraform के पिछले संस्करणों में सभी प्लगइन्स एक ज़िप फ़ाइल में शामिल थे। उदाहरण के लिए, जब आप 0.6.12 से 0.6.15 पर अपग्रेड हुए थे, तो प्रत्येक प्लगइन फ़ाइल के नए संस्करण ने डिस्क पर पुराने को बदल दिया होगा, और आपने प्रत्येक प्लगइन के नवीनतम संस्करण को समाप्त कर दिया होगा।

आगे जाकर वितरण में केवल एक फ़ाइल है, इसलिए आपको Terraform <0.7 से Terraform 0.7 या उच्चतर में अपग्रेड करते समय एक बार की सफाई करने की आवश्यकता होगी।

यदि आप निम्न-स्तरीय विवरणों के बारे में उत्सुक हैं, तो पढ़ते रहें!

जाओ प्लगइन वास्तुकला

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

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

अन्य भाषाओं में, गतिशील पुस्तकालयों का उपयोग करके प्लगइन्स बनाए जाते हैं। चूंकि गो में यह हमारे लिए कोई विकल्प नहीं है, इसलिए हम इसके बजाय एक नेटवर्क आरपीसी इंटरफ़ेस का उपयोग करते हैं। इसका अर्थ है कि प्रत्येक प्लगइन एक स्वतंत्र कार्यक्रम है, और साझा मेमोरी के माध्यम से संचार करने के बजाय, मुख्य प्रक्रिया HTTP पर प्लगइन प्रक्रिया के साथ संचार करती है। जब आप टेराफ़ॉर्म शुरू करते हैं, तो यह उस प्लगइन की पहचान करता है जिसका आप उपयोग करना चाहते हैं, इसे डिस्क पर ढूँढता है, अन्य बाइनरी चलाता है, और यह सुनिश्चित करने के लिए कुछ हैंडशेक करता है कि वे एक-दूसरे से बात कर सकते हैं (अपग्रेड के बाद आप जो त्रुटि देख सकते हैं वह हैंडशेक विफलता है आरपीसी कोड)।

downsides

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

टेराफॉर्म में 0.6.15 में डिस्क पर लगभग 750 एमबी का उपयोग करते हुए कुल 42 कार्यक्रम थे। और यह पता चला कि लगभग 600MB डुप्लिकेट डेटा है! यह आपकी हार्ड ड्राइव पर बहुत सी जगह और हमारे CDN पर बहुत अधिक बैंडविड्थ का उपयोग करता है। सौभाग्य से, इस समस्या को हल करने का एक तरीका है।

हमारा समाधान

Terraform 0.7 में हमने सभी कार्यक्रमों को एक ही बाइनरी में विलय कर दिया। हम एक विशेष कमांड terraform internal-plugin का उपयोग करके करते हैं जो हमें अतिरिक्त तर्कों के साथ एक ही टेराफ़ॉर्म बाइनरी को कॉल करके एक प्लग इनवॉइस करने की अनुमति देता है। संक्षेप में, Terraform अब प्रत्येक प्लगइन में विशेष व्यवहार को सक्रिय करने के लिए सिर्फ खुद को कॉल करता है।

हमारे समुदाय का समर्थन करना

आप ऐसा क्यों करेंगे? क्यों न केवल नेटवर्क आरपीसी इंटरफ़ेस को समाप्त करें और सब कुछ सरल करें?

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

नेटवर्क RPC इंटरफ़ेस का उपयोग करके, आप Terraform के लिए एक प्लगइन का निर्माण और वितरण कर सकते हैं बिना Terraform के पुनर्निर्माण के लिए। यह आपके लिए अपने संगठन के आंतरिक उपयोग के लिए टेराफॉर्म प्लगइन का निर्माण करना आसान बनाता है, एक मालिकाना एपीआई के लिए जिसे आप स्रोत को खोलना नहीं चाहते हैं, या मुख्य परियोजना में वापस योगदान करने से पहले कुछ प्रोटोटाइप करना चाहते हैं।

सिद्धांत रूप में, क्योंकि प्लगइन इंटरफ़ेस HTTP है, आप पूरी तरह से अलग प्रोग्रामिंग भाषा का उपयोग करके एक प्लगइन भी विकसित कर सकते हैं! (डिस्क्लेमर, आपको प्लगइन एपीआई को फिर से लागू करना होगा जो काम का मामूली हिस्सा नहीं है।)

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