टेराफॉर्म का उपयोग करते समय सर्वोत्तम अभ्यास [बंद]


111

मैं अपने बुनियादी ढांचे की टेराफ़ॉर्म पर स्वैप करने की प्रक्रिया में हूं। वास्तव में टेराफ़ॉर्म फ़ाइलों और राज्य के प्रबंधन के लिए सबसे अच्छा अभ्यास क्या है? मुझे लगता है कि यह कोड के रूप में बुनियादी ढाँचा है, और मैं अपनी .tf फ़ाइलों को git में करूँगा, लेकिन क्या मैं tststate भी करता हूँ? क्या वह S3 की तरह कहीं रहना चाहिए? मैं अंततः CI के लिए यह सब प्रबंधित करना चाहूंगा, लेकिन यह बहुत दूर है और मुझे फाइलों के लिए चल रहे टुकड़ों का पता लगाने की आवश्यकता है।

मैं वास्तव में सिर्फ यह देखना चाहता हूं कि वहां के लोग वास्तव में इस प्रकार के सामान का उत्पादन में उपयोग कैसे करते हैं

जवाबों:


85

मैं मौजूदा AWS इंफ्रास्ट्रक्चर को Terraform में स्थानांतरित करने की स्थिति में भी हूं, ताकि मैं जवाब विकसित करने का लक्ष्य रखूं।

मैं आधिकारिक टेराफ़ॉर्म उदाहरणों और कई परीक्षण और त्रुटि पर भरोसा कर रहा हूं जो उन क्षेत्रों को बाहर करने के लिए हैं जिनमें मैं अनिश्चित रहा हूं।

.tfstate फ़ाइलें

टेराफॉर्म कॉन्फिगरेशन का उपयोग विभिन्न इन्फ्रास्ट्रक्चर पर कई बॉक्स को व्यवस्थित करने के लिए किया जा सकता है, जिनमें से प्रत्येक का एक अलग राज्य हो सकता है। जैसा कि यह कई लोगों द्वारा चलाया जा सकता है यह राज्य एक केंद्रीकृत स्थान पर होना चाहिए (जैसे S3) लेकिन गिट नहीं

इसकी पुष्टि टेराफॉर्म को देखते हुए की जा सकती है .gitignore

डेवलपर नियंत्रण

हमारा उद्देश्य पूर्ण ऑडिट (git लॉग) को बनाए रखने के लिए डेवलपर्स को बुनियादी ढाँचे का अधिक नियंत्रण प्रदान करना है और परिवर्तन की जाँच करने (अनुरोधों को स्वीकार करने) की क्षमता है। नए बुनियादी ढांचे के वर्कफ़्लो को ध्यान में रखते हुए

  1. आम एएमआई का आधार नींव जिसमें पुन: प्रयोज्य मॉड्यूल जैसे कठपुतली शामिल हैं।
  2. Terraform का उपयोग करके DevOps द्वारा कोर इंफ्रास्ट्रक्चर का प्रावधान।
  3. डेवलपर्स Git में Terraform कॉन्फ़िगरेशन को आवश्यकतानुसार बदलते हैं (उदाहरणों की संख्या; नया VPC; क्षेत्र / उपलब्धता क्षेत्र आदि के अलावा)।
  4. Git कॉन्फ़िगरेशन को धकेल दिया गया और DevOps दस्ते के एक सदस्य द्वारा जाँच की जाने वाली पवित्रता के लिए एक पुल अनुरोध प्रस्तुत किया गया।
  5. यदि अनुमोदित हो, तो निर्माण करने और तैनात करने के लिए CI को webhook कहता है (इस समय कई वातावरणों को विभाजित करने का तरीका अनिश्चित करें)

1 संपादित करें - वर्तमान स्थिति पर अपडेट करें

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

ख़ाका

हमारे पास कई VPC के साथ कई सबनेट के साथ एक जटिल AWS इन्फ्रास्ट्रक्चर है। इसे आसानी से प्रबंधित करने की कुंजी एक लचीली वर्गीकरण को परिभाषित करना था जो क्षेत्र, पर्यावरण, सेवा और स्वामी को सम्मिलित करता है जिसे हम अपने बुनियादी ढांचे के कोड (टेराफॉर्म और कठपुतली) दोनों को व्यवस्थित करने के लिए उपयोग कर सकते हैं।

मॉड्यूल

अगला कदम था हमारे टेराफॉर्म मॉड्यूल को स्टोर करने के लिए एक सिंगल गिट रिपॉजिटरी बनाना। मॉड्यूल के लिए हमारी शीर्ष स्तर की संरचना इस तरह दिखती है:

tree -L 1 .

परिणाम:

├── README.md
├── aws-asg
├── aws-ec2
├── aws-elb
├── aws-rds
├── aws-sg
├── aws-vpc
└── templates

प्रत्येक व्यक्ति कुछ समझदार चूक निर्धारित करता है, लेकिन उन्हें उन चरों के रूप में उजागर करता है जिन्हें हमारे "गोंद" द्वारा अधिलेखित किया जा सकता है।

गोंद

हमारे पास हमारे साथ एक दूसरा रिपॉजिटरी है glueजो ऊपर उल्लिखित मॉड्यूल का उपयोग करता है। इसे हमारे टैक्सोनॉमी दस्तावेज़ के अनुरूप रखा गया है:

.
├── README.md
├── clientA
   ├── eu-west-1
      └── dev
   └── us-east-1
       └── dev
├── clientB
   ├── eu-west-1
      ├── dev
      ├── ec2-keys.tf
      ├── prod
      └── terraform.tfstate
   ├── iam.tf
   ├── terraform.tfstate
   └── terraform.tfstate.backup
└── clientC
    ├── eu-west-1
       ├── aws.tf
       ├── dev
       ├── iam-roles.tf
       ├── ec2-keys.tf
       ├── prod
       ├── stg
       └── terraform.tfstate
    └── iam.tf

ग्राहक स्तर के अंदर हमारे पास AWS खाता विशिष्ट .tfफाइलें हैं जो वैश्विक संसाधनों (IAM भूमिकाओं की तरह) का प्रावधान करती हैं; अगले EC2 SSH सार्वजनिक कुंजी के साथ क्षेत्र स्तर है; अंत में हमारे पर्यावरण (में dev, stg, prodआदि) हमारे VPC व्यवस्था, उदाहरण के निर्माण और कनेक्शन आदि जमा हो जाती है झाँक रहा है।

साइड नोट: जैसा कि आप देख सकते हैं कि मैं अपनी सलाह के terraform.tfstateविपरीत जा रहा हूं । यह एक अस्थायी उपाय है जब तक मैं S3 में नहीं जाता लेकिन मुझे सूट करता है क्योंकि मैं वर्तमान में एकमात्र डेवलपर हूं।

अगला कदम

यह अभी भी एक मैनुअल प्रक्रिया है और जेनकिंस में अभी तक नहीं है, लेकिन हम एक बड़े, जटिल बुनियादी ढांचे और अब तक बहुत अच्छे हैं। जैसा मैंने कहा, कुछ कीड़े लेकिन अच्छी तरह से जा रहे हैं!

2 संपादित करें - परिवर्तन

लगभग एक साल हो गया है क्योंकि मैंने यह प्रारंभिक उत्तर और टेराफॉर्म की स्थिति और अपने आप को लिखा है। मैं अब एक Azure क्लस्टर का प्रबंधन करने के लिए Terraform का उपयोग करके एक नई स्थिति में हूं और Terraform अब है v0.10.7

राज्य

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

मॉड्यूल

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

फ़ाइल संरचना

नई स्थिति में केवल दो infx वातावरण के साथ एक बहुत सरल वर्गीकरण है - devऔर prod। प्रत्येक के पास अपने स्वयं के चर और आउटपुट हैं, जो हमारे ऊपर निर्मित मॉड्यूल का पुन: उपयोग कर रहे हैं। remote_stateप्रदाता भी वातावरण के बीच बनाई गई संसाधनों के आउटपुट को साझा करने में मदद करता है। हमारा परिदृश्य विभिन्न Azure संसाधन समूहों में वैश्विक रूप से प्रबंधित TLD में उप-डोमेन है।

├── main.tf
├── dev
   ├── main.tf
   ├── output.tf
   └── variables.tf
└── prod
    ├── main.tf
    ├── output.tf
    └── variables.tf

योजना

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

कुल मिलाकर हम टेराफॉर्म से बहुत खुश हैं और नई सुविधाओं के साथ सीखना और सुधार करना जारी रखते हैं।


क्या आपके पास इस उत्तर के बाद से कोई भाग्य / मुद्दे हैं? तुम्हारा बहुत पसंद है जो मैं करने के लिए लक्ष्य कर रहा हूँ, लेकिन तुम मुझसे आगे हो सकता है।
मार्क यंग

3
मैं उत्सुक हूं कि आपको क्यों लगता है कि tststate फ़ाइलों को git में संग्रहीत नहीं किया जाना चाहिए? क्या यह सिर्फ इसलिए है क्योंकि पुराना राज्य बचाने लायक नहीं है, या अन्य मुद्दे हैं?
एगबोडिक

3
@agbodike - जब एक ही डेवलपर या बहुत छोटी टीम के हिस्से के रूप में काम करते हैं, तब तक इसे नियमित रूप से प्रतिबद्ध और संघर्ष से बचने के लिए धकेल दिया जाता है। मेरा अगला कदम एस 3 में उनके दूरस्थ राज्य डॉक्स के अनुसार इसे स्थापित करना है (जो यह भी कहता है: "यह एक टीम में टेराफॉर्म के साथ काम करना जटिल बनाता है क्योंकि यह मर्ज संघर्ष का लगातार स्रोत है। दूरस्थ राज्य इन मुद्दों को कम करने में मदद करता है।") । अधिकांश चीजों के साथ हालांकि अच्छी टीम संचार राज्य को पकड़ने के लिए सबसे अधिक / सभी मुद्दों को बेपरवाह करने में मदद कर सकता है :-)
इवान

1
@ the0ther - मुझे डर है कि मेरा मुख्य भंडार मालिकाना है हालांकि मैं वर्तमान में एक व्यक्तिगत काम कर रहा हूं जिसे मैं निकट भविष्य में सार्वजनिक रूप से उपलब्ध कराऊंगा।
ईवान

2
Git repo @Ewan पर कोई भाग्य? मुझे यह देखना अच्छा लगेगा कि आप क्या कर रहे हैं।
डेविड

85

हम टेराफॉर्म का भारी उपयोग करते हैं और हमारा अनुशंसित सेटअप निम्नानुसार है:

फ़ाइल लेआउट

हम आपके प्रत्येक वातावरण (उदाहरण के लिए चरण, ठेस, qa) के लिए टेराफॉर्म कोड को टेम्प्लेट के अलग-अलग सेट (और इसलिए, अलग-अलग .tfstateफ़ाइलों) में संग्रहीत करने की सलाह देते हैं । यह महत्वपूर्ण है ताकि परिवर्तन करते समय आपके अलग-अलग वातावरण वास्तव में एक-दूसरे से अलग-थलग हों। अन्यथा, मंचन में कुछ कोड के साथ खिलवाड़ करते समय, ठेस में भी कुछ उड़ा देना बहुत आसान है। देखें terraform है, VPC, और आप env प्रति एक tfstate फ़ाइल क्यों चाहते हैं यही कारण है कि का एक रंगीन चर्चा के लिए।

इसलिए, हमारा विशिष्ट फ़ाइल लेआउट इस तरह दिखता है:

stage
   main.tf
   vars.tf
   outputs.tf
prod
   main.tf
   vars.tf
   outputs.tf
global
   main.tf
   vars.tf
   outputs.tf

चरण VPC के लिए सभी टेराफ़ॉर्म कोड stageफ़ोल्डर में चला जाता है , ठेस VPC के लिए सभी कोड prodफ़ोल्डर में चला जाता है , और सभी कोड जो VPC के बाहर रहता है (जैसे IAM उपयोगकर्ता, SNS विषय, S3 बाल्टी) globalफ़ोल्डर में जाता है ।

ध्यान दें कि, कन्वेंशन द्वारा, हम आमतौर पर अपने टेराफॉर्म कोड को ३ फाइलों में तोड़ देते हैं:

  • vars.tf: इनपुट चर।
  • outputs.tf: आउटपुट चर।
  • main.tf: वास्तविक संसाधन।

मॉड्यूल

आमतौर पर, हम अपने बुनियादी ढांचे को दो फ़ोल्डरों में परिभाषित करते हैं:

  1. infrastructure-modules: इस फ़ोल्डर में छोटे, पुन: प्रयोज्य, संस्करणित मॉड्यूल हैं। प्रत्येक मॉड्यूल के बारे में सोचें कि बुनियादी ढांचे का एक टुकड़ा कैसे बनाया जाए, जैसे कि VPC या डेटाबेस।
  2. infrastructure-live: इस फोल्डर में वास्तविक लाइव, रनिंग इन्फ्रास्ट्रक्चर है, जो इसे मॉड्यूल के संयोजन द्वारा बनाता है infrastructure-modules। इस फ़ोल्डर में कोड के बारे में सोचें जो आपके ब्लूप्रिंट से निर्मित वास्तविक घर हैं।

एक Terraform मॉड्यूल एक फ़ोल्डर में Terraform टेम्पलेट्स के किसी भी सेट है। उदाहरण के लिए, हम नामक फ़ोल्डर हो सकता है vpcमें infrastructure-modulesएक भी VPC के लिए सभी मार्ग टेबल, सबनेट, द्वार, एसीएल कि परिभाषित करता है, आदि:

infrastructure-modules
   vpc
     main.tf
     vars.tf
     outputs.tf

हम तो उस मॉड्यूल का उपयोग कर सकते हैं infrastructure-live/stageऔर infrastructure-live/prodमंच और उत्पादन VPCs बनाने के लिए। उदाहरण के लिए, यहाँ ऐसा infrastructure-live/stage/main.tfदिख सकता है:

module "stage_vpc" {
  source = "git::git@github.com:gruntwork-io/module-vpc.git//modules/vpc-app?ref=v0.0.4"

  vpc_name         = "stage"
  aws_region       = "us-east-1"
  num_nat_gateways = 3
  cidr_block       = "10.2.0.0/18"
}

एक मॉड्यूल का उपयोग करने के लिए, आप moduleसंसाधन का उपयोग करते हैं और उसके sourceक्षेत्र को अपनी हार्ड ड्राइव (जैसे source = "../infrastructure-modules/vpc") पर या तो स्थानीय पथ पर इंगित करते हैं , जैसा कि ऊपर दिए गए उदाहरण में है, एक Git URL ( मॉड्यूल स्रोत देखें )। Git URL का लाभ यह है कि हम एक विशिष्ट git sha1 या टैग ( ref=v0.0.4) निर्दिष्ट कर सकते हैं । अब, न केवल हम अपने बुनियादी ढांचे को छोटे मॉड्यूलों के एक समूह के रूप में परिभाषित करते हैं, बल्कि हम उन मॉड्यूलों को संस्करण बना सकते हैं और सावधानीपूर्वक अद्यतन या आवश्यकतानुसार रोलबैक कर सकते हैं।

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

राज्य

जब आप संसाधन बनाने के लिए टेराफ़ॉर्म का उपयोग करते हैं (उदाहरण के लिए EC2 इंस्टेंस, डेटाबेस, VPCs), तो यह एक .tfstateफ़ाइल में बनाई गई जानकारी को रिकॉर्ड करता है। उन संसाधनों में परिवर्तन करने के लिए, आपकी टीम के सभी लोगों को इसी .tfstateफ़ाइल तक पहुंचने की आवश्यकता है , लेकिन आपको इसे Git में नहीं देखना चाहिए ( स्पष्टीकरण के लिए यहां देखें क्यों )।

इसके बजाय, हम टेराफ़ॉर्म रिमोट स्टेट.tfstate को सक्षम करके S3 में फ़ाइलों को संग्रहीत करने की सलाह देते हैं , जो आपके द्वारा टेराफ़ॉर्म चलाने पर हर बार नवीनतम फ़ाइलों को स्वचालित रूप से धक्का / खींच देगा। सुनिश्चित करें कि आप अपने S3 बाल्टी में संस्करण बनाना सक्षम कर सकते हैं ताकि आप पुरानी फ़ाइलों को वापस ले सकें यदि आप किसी भी तरह नवीनतम संस्करण को दूषित करते हैं। हालांकि, एक महत्वपूर्ण नोट: टेराफॉर्म लॉकिंग प्रदान नहीं करता है । इसलिए अगर दो टीम के सदस्य एक ही फाइल पर एक ही समय पर चलते हैं , तो वे एक-दूसरे के बदलावों को लिख सकते हैं।.tfstateterraform apply.tfstate

इस समस्या को हल करने के लिए, हमने टेराग्रंट नामक एक ओपन सोर्स टूल बनाया , जो टेराफॉर्म के लिए एक पतला आवरण है जो लॉकिंग प्रदान करने के लिए अमेज़ॅन डायनमोबीडी का उपयोग करता है (जो कि अधिकांश टीमों के लिए पूरी तरह से मुक्त होना चाहिए)। की जाँच करें Terragrunt साथ terraform को स्वत: रिमोट राज्य लॉकिंग और कॉन्फ़िगरेशन जोड़ें अधिक जानकारी के लिए।

आगे की पढाई

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

अद्यतन: व्यापक गाइड टू टेराफॉर्म ब्लॉग पोस्ट श्रृंखला इतनी लोकप्रिय हुई कि हमने इसे टेराफॉर्म नामक पुस्तक में विस्तारित किया : अप एंड रनिंग !


मुझे लगता है कि यह सही उत्तर है। मॉड्यूल का उपयोग करें, उन्हें संस्करण, और वातावरण अलग रखें।
रैंगलर

क्या दूरस्थ कॉन्फ़िगरेशन चरण को हर बार अलग टेराफ़ॉर्म घटक / पर्यावरण / मॉड्यूल / जो भी टेराग्रंट या कुछ अन्य आवरण का उपयोग नहीं कर रहा है, पर काम करने की आवश्यकता है?
jmreicha

@jmreicha: remote configयदि आपको अभी-अभी अपने टेराफ़ॉर्म कॉन्फ़िगरेशन की जाँच करनी हो या यदि आप पिछले दूरस्थ कॉन्फ़िगरेशन को बदलना चाहते हैं, तो आपको चलाने की आवश्यकता है । Terraform 0.9 की अवधारणा को पेश करेगा backends, जो इसे बहुत सरल करेगा। देखें इस पीआर अधिक जानकारी के लिए।
येवगेनी ब्रिकमैन

बस इतना कि मैं समझता हूं - मैं एक वातावरण 'स्टेज' पर काम कर रहा हूं, लेकिन फिर 'ठेस' पर काम करना शुरू करूंगा। मुझे remote configठेस पहुंचाने के लिए कमांड को फिर से चलाने की आवश्यकता होगी । प्रति वातावरण अलग राज्य मान लिया। क्या वह सही है? मैं v0.9 के लिए तत्पर हैं।
jmreicha

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

9

पहले इसे remote configअनुमति दी गई थी लेकिन अब इसे " बैकएंड " द्वारा बदल दिया गया है , इसलिए टेराफ़ॉर्म रिमोट अब उपलब्ध नहीं है।

terraform remote config -backend-config="bucket=<s3_bucket_to_store_tfstate>" -backend-config="key=terraform.tfstate" -backend=s3
terraform remote pull
terraform apply
terraform remote push

देखें डॉक्स जानकारी के लिए।


क्या दूरस्थ स्रोत को हर बार एक अलग टेराफ़ॉर्म घटक / पर्यावरण / मॉड्यूल / जो भी काम करना चाहते हैं, उसे फिर से जोड़ने की आवश्यकता है?
21

6

@Ygengen Brikman द्वारा विशेष रूप से ओपी के सवालों का जवाब देते हुए अधिक गहराई से कवर किया गया:

वास्तव में टेराफ़ॉर्म फ़ाइलों और राज्य के प्रबंधन के लिए सबसे अच्छा अभ्यास क्या है?

TF फ़ाइलों के लिए git का उपयोग करें। लेकिन (यानी tfstate) में राज्य फ़ाइलों की जाँच न करें। इसके बजाय TerragruntS3 के लिए राज्य फ़ाइलों के सिंक / लॉकिंग का उपयोग करें ।

लेकिन मैं भी tfstate प्रतिबद्ध है?

नहीं।

क्या वह S3 की तरह कहीं रहना चाहिए?

हाँ


2

मुझे पता है कि यहां बहुत सारे उत्तर हैं लेकिन मेरा दृष्टिकोण काफी अलग है।

   Modules
   Environment management 
   Separation of duties

मॉड्यूल

  1. संसाधनों के तार्किक संग्रह के लिए मॉड्यूल बनाएं। उदाहरण: यदि आपका लक्ष्य एक एपीआई को तैनात करना है, जिसके लिए एक DB, HA VMs, ऑटोस्कोलिंग, DNS, PubSub और ऑब्जेक्ट स्टोरेज की आवश्यकता होती है, तो इन सभी संसाधनों को एक ही मॉड्यूल में टेम्पलेट किया जाना चाहिए।
  2. एकल संसाधन का उपयोग करने वाले मॉड्यूल बनाने से बचें। यह किया जा सकता है और रजिस्ट्री में बहुत सारे मॉड्यूल ऐसा करते हैं लेकिन यह एक अभ्यास है जो बुनियादी ढांचे के ऑर्केस्ट्रेशन के बजाय संसाधन पहुंच के साथ मदद करता है। उदाहरण: AWS EC2 के लिए एक मॉड्यूल उपयोगकर्ता को इनवॉइस करने के लिए जटिल विन्यास बनाकर EC2 तक पहुंचने में मदद करता है, लेकिन उदाहरण के लिए एक मॉड्यूल 1. जैसे उपयोगकर्ता को एप्लिकेशन, कंपोनेंट या सर्विस संचालित इंफ्रास्ट्रक्चर को ऑर्केस्ट्रेट करते समय मदद करता है।
    1. अपने कार्यक्षेत्र में संसाधन घोषणाओं से बचें। यह आपके कोड को व्यवस्थित और व्यवस्थित रखने के बारे में अधिक है। जैसा कि मॉड्यूल आसानी से संस्करणबद्ध हैं, आपके पास अपनी रिलीज़ पर अधिक नियंत्रण है।

पर्यावरण प्रबंधन

IaC ने SDLC प्रक्रिया को बुनियादी ढाँचे के प्रबंधन के लिए प्रासंगिक बना दिया है और विकास के बुनियादी ढांचे के साथ-साथ विकास अनुप्रयोगों के वातावरण की अपेक्षा करना सामान्य नहीं है।

  1. अपने IaC वातावरण को प्रबंधित करने के लिए फ़ोल्डर का उपयोग न करें। यह बहाव की ओर जाता है क्योंकि आपके बुनियादी ढांचे के लिए कोई सामान्य टेम्पलेट नहीं है।
  2. पर्यावरण विनिर्देशों को नियंत्रित करने के लिए एक ही कार्यक्षेत्र और चर का उपयोग करें। उदाहरण: अपने मॉड्यूल लिखें ताकि जब आप पर्यावरण चर को बदलते हैं (var.stage लोकप्रिय है) अपनी आवश्यकताओं को फिट करने के लिए योजना बदल देता है। आमतौर पर वातावरण को मात्रा, जोखिम और क्षमता के साथ अलग-अलग होना चाहिए, आमतौर पर परिवर्तनशील विन्यास होते हैं। देव निजी वीरानी में 1 वीएम और 1 जीबी रैम के साथ 1 वीएम तैनात कर सकते हैं, लेकिन उत्पादन 2 कोर के साथ 3 वीएम और अतिरिक्त सार्वजनिक टोपोलॉजी के साथ 4 जीबी रैम हो सकता है। आपके पास निश्चित रूप से अधिक भिन्नता हो सकती है: लागत बचाने के लिए अनुप्रयोग के रूप में देव एक ही सर्वर पर डेटाबेस प्रक्रिया चला सकते हैं लेकिन उत्पादन में एक समर्पित DB उदाहरण हो सकता है। यह सब एक एकल चर, कथन विवरण और प्रक्षेप को बदलकर प्रबंधित किया जा सकता है।

काम का बटवारा

यदि आप किसी छोटे संगठन में हैं या व्यक्तिगत आधारभूत संरचना चला रहे हैं तो यह वास्तव में लागू नहीं होता है लेकिन यह आपके कार्यों को प्रबंधित करने में आपकी सहायता करेगा।

  1. कर्तव्यों, जिम्मेदारियों या टीमों द्वारा अपने बुनियादी ढांचे को तोड़ दें। उदाहरण: साझा सेवाओं (वर्चुअल नेटवर्क, सबनेट, पब्लिक आईपी एड्रेस, लॉग ग्रुप, गवर्नेंस रिसोर्सेज, मल्टी टेंस्ड डीबी, शेयर्ड कीज, इत्यादि) पर केंद्रीय आईटी नियंत्रण। , PubSub आदि) और डेटा स्रोत और दूरस्थ राज्य लुकअप के माध्यम से केंद्रीय आईटी सेवाओं का उपभोग करते हैं।
    1. सरकार की टीम पहुंच उदाहरण: केंद्रीय IT में अधिकार हो सकते हैं लेकिन API टीम के पास केवल सार्वजनिक क्लाउड APIs के प्रतिबंधित सेट तक पहुंच होती है।

यह रिलीज की चिंताओं के साथ भी मदद करता है क्योंकि आप पाएंगे कि कुछ संसाधन शायद ही कभी बदलते हैं जबकि अन्य हर समय बदलते हैं। पृथक्करण जोखिम और जटिलता को दूर करता है।

यह रणनीति AWS की बहु खाता रणनीति के साथ समानताएं बनाती है। अधिक जानकारी के लिए पढ़ें।

सीआई / सीडी

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

एनबी मोबाइल पर लिखा गया है तो कृपया किसी भी त्रुटि का बहाना करें।


0

इससे पहले कि उत्तर बहुत ठोस और जानकारीपूर्ण हों, मैं यहां अपने 2 सेंट जोड़ने की कोशिश करूंगा

कोडिंग संरचना के लिए सामान्य सिफारिशें

  1. कम संसाधनों के साथ काम करना आसान और तेज़ है:

    • सीएमडी terraform planऔर terraformसंसाधनों की स्थिति को सत्यापित करने के लिए दोनों मेकअप बादल API कॉल लागू होते हैं।
    • यदि आपके पास एकल संरचना में आपका पूरा आधारभूत ढांचा है तो इसमें कई मिनट लग सकते हैं (भले ही आपके पास एक ही फ़ोल्डर में कई फाइलें हों)।
  2. ब्लास्ट त्रिज्या कम संसाधनों के साथ छोटा है:

    • एक दूसरे से असंबंधित संसाधनों को अलग-अलग रचनाओं (फ़ोल्डरों) में रखने से कुछ गलत होने पर जोखिम कम हो जाता है।
  3. दूरस्थ राज्य का उपयोग करके अपनी परियोजना शुरू करें:

    • आपका लैपटॉप आपके बुनियादी ढांचे के सत्य के लिए कोई जगह नहीं है।
    • tfstateफ़ाइल को git में प्रबंधित करना एक बुरा सपना है।
    • बाद में जब किसी भी दिशा (निर्भरता या संसाधनों की संख्या) में बुनियादी ढांचे की परतें बढ़ने लगती हैं।
    • उदाहरण मॉड्यूल: https://github.com/cloudposse/terraform-aws-tfstate-backend
    • रेफरी टूल: https://github.com/camptocamp/terraboard
  4. एक सुसंगत संरचना और नामकरण सम्मेलन का अभ्यास करने का प्रयास करें:

    • प्रक्रियात्मक कोड की तरह, लोगों को पहले पढ़ने के लिए टेराफ़ॉर्म कोड लिखा जाना चाहिए, अब से छह महीने बाद परिवर्तन होने पर स्थिरता में मदद मिलेगी।
    • टेराफ़ॉर्म राज्य फ़ाइल में संसाधनों को स्थानांतरित करना संभव है लेकिन अगर आपके पास असंगत संरचना और नामकरण है, तो यह करना कठिन हो सकता है।
  5. संसाधन मॉड्यूल को यथासंभव सरल रखें।

  6. मत हार्ड कोड मान जो चर के रूप में पारित किया जा सकता है या डेटा स्रोतों का उपयोग की खोज की।

  7. संरचना के भीतर बुनियादी ढांचे के मॉड्यूल के बीच dataस्रोतों और terraform_remote_stateविशेष रूप से गोंद के रूप में उपयोग करें ।

( रेफ लेख: https://www.terraform-best-practices.com/code-structure )


उदाहरण:

कम संख्या में संसाधनों के साथ काम करना आसान और तेज़ है इसलिए नीचे हम एक अनुशंसित कोड लेआउट प्रस्तुत करते हैं।

नोट: जिस तरह से संदर्भ का कड़ाई से पालन नहीं किया जाना चाहिए क्योंकि प्रत्येक परियोजना की अपनी विशिष्ट विशेषताएं हैं

.
├── 1_tf-backend #remote AWS S3 + Dynamo Lock tfstate 
   ├── main.tf
   ├── ...
├── 2_secrets
   ├── main.tf
   ├── ...
├── 3_identities
   ├── account.tf
   ├── roles.tf
   ├── group.tf
   ├── users.tf
   ├── ...
├── 4_security
   ├── awscloudtrail.tf
   ├── awsconfig.tf
   ├── awsinspector.tf
   ├── awsguarduty.tf
   ├── awswaf.tf
   └── ...
├── 5_network
   ├── account.tf
   ├── dns_remote_zone_auth.tf
   ├── dns.tf
   ├── network.tf
   ├── network_vpc_peering_dev.tf
   ├── ...
├── 6_notifications
   ├── ...
├── 7_containers
   ├── account.tf
   ├── container_registry.tf
   ├── ...
├── config
   ├── backend.config
   └── main.config
└── readme.md

0

मेरा मानना ​​है कि बुनियादी ढांचे की परिक्रमा के लिए टेराफॉर्म का उपयोग करते समय कुछ सर्वोत्तम प्रथाओं का पालन करने की आवश्यकता है

  1. फिर से वही कोड न लिखें (पुन: प्रयोज्य)
  2. इसे आसानी से बनाए रखने के लिए पर्यावरण विन्यास को अलग रखें।
  3. सुगम लॉकिंग को संभालने के लिए रिमोट बैकएंड s3 (एन्क्रिप्टेड) ​​और डायनेमो डीबी का उपयोग करें
  4. एक मॉड्यूल बनाएं और उस मॉड्यूल को मुख्य बुनियादी ढांचे में कई बार उपयोग करें, इसके पुन: प्रयोज्य कार्य की तरह जिसे विभिन्न मापदंडों को पारित करके कई बार कहा जा सकता है।

कई वातावरण संभालते हैं

अधिकांश समय अनुशंसित तरीका कई वातावरणों को संभालने के लिए टेराफॉर्म 'कार्यक्षेत्र' का उपयोग करना है, लेकिन मेरा मानना ​​है कि कार्यक्षेत्र का उपयोग किसी संगठन में काम करने के तरीके के आधार पर भिन्न हो सकता है। अन्य पर्यावरण के राज्यों को अलग करने के लिए आपके प्रत्येक वातावरण (जैसे चरण, ठेस, QA) के लिए टेराफ़ॉर्म कोड संग्रहीत कर रहा है। हालाँकि, इस मामले में हम कई स्थानों पर एक ही कोड कॉपी कर रहे हैं।

├── main.tf
├── dev
   ├── main.tf
   ├── output.tf
   └── variables.tf
└── prod
├── main.tf
├── output.tf
└── variables.tf

मैंने प्रत्येक पर्यावरण फ़ोल्डर में रख कर उसी टेराफॉर्म कोड के दोहराव से बचने और बचने के लिए कुछ अलग दृष्टिकोण का पालन किया क्योंकि मेरा मानना ​​है कि अधिकांश समय सभी वातावरण 90% समान होंगे।

├── deployment
 ├── 01-network.tf
 ├── 02-ecs_cluster.tf
 ├── 03-ecs_service.tf
 ├── 04-eks_infra.tf
 ├── 05-db_infra.tf
 ├── 06-codebuild-k8s.tf
 ├── 07-aws-secret.tf
 ├── backend.tf
 ├── provider.tf
 └── variables.tf
├── env
 ├── dev
  ├── dev.backend.tfvar
  └── dev.variables.tfvar
 └── prod
 ├── prod.backend.tfvar
 └── prod.variables.tfvar
├── modules
 └── aws
 ├── compute
  ├── alb_loadbalancer
  ├── alb_target_grp
  ├── ecs_cluster
  ├── ecs_service
  └── launch_configuration
 ├── database
  ├── db_main
  ├── db_option_group
  ├── db_parameter_group
  └── db_subnet_group
 ├── developertools
 ├── network
  ├── internet_gateway
  ├── nat_gateway
  ├── route_table
  ├── security_group
  ├── subnet
  ├── vpc
 └── security
 ├── iam_role
 └── secret-manager
└── templates

वातावरण से संबंधित विन्यास

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

  • dev.backend.tfvar

      region = "ap-southeast-2"
      bucket = "dev-samplebackendterraform"
      key = "dev/state.tfstate"
      dynamo_db_lock = "dev-terraform-state-lock"
  • dev.variable.tfvar

    environment                     =   "dev"
    vpc_name                        =   "demo"
    vpc_cidr_block                  =   "10.20.0.0/19"
    private_subnet_1a_cidr_block    =   "10.20.0.0/21"
    private_subnet_1b_cidr_block    =   "10.20.8.0/21"
    public_subnet_1a_cidr_block     =   "10.20.16.0/21"
    public_subnet_1b_cidr_block     =   "10.20.24.0/21"

बुनियादी ढांचे के हिस्से की सशर्त लंघन

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

variable vpc_create {
   default = "true"
}

module "vpc" {
  source = "../modules/aws/network/vpc"
  enable = "${var.vpc_create}"
  vpc_cidr_block = "${var.vpc_cidr_block}"
  name = "${var.vpc_name}"
 }

 resource "aws_vpc" "vpc" {
    count                = "${var.enable == "true" ? 1 : 0}"
    cidr_block           = "${var.vpc_cidr_block}"
    enable_dns_support   = "true"
   enable_dns_hostnames = "true"
}

नीचे दिए गए आदेश को आवश्यक वातावरण फ़ोल्डर के लिए प्रत्येक वातावरण, सीडी के लिए इन्फ्रा परिवर्तनों को आरंभ करने और निष्पादित करने के लिए आवश्यक है।

  terraform init -var-file=dev.variables.tfvar -backend-config=dev.backend.tfvar ../../deployment/

  terraform apply -var-file=dev.variables.tfvar ../../deployment

संदर्भ के लिए: https://github.com/mattyait/devops_terraform


0

मुझे सबफ़ोल्डर्स का विचार पसंद नहीं है क्योंकि इससे प्रति वातावरण में विभिन्न स्रोतों का परिणाम होगा और यह बहाव में बदल जाता है।

बेहतर तरीका यह है कि सभी वातावरणों के लिए एक ही ढेर हो (देव, प्रोप्रोड और ठेस कहते हैं)। एकल पर्यावरण उपयोग पर काम करना terraform workspace

terraform workspace new dev

यह एक नया कार्यक्षेत्र बनाता है। यह एक समर्पित स्टेट फाइल और वैरिएबल terraform.workspaceका उपयोग करता है जिसे आप अपने कोड में उपयोग कर सकते हैं।

resource "aws_s3_bucket" "bucket" {
  bucket = "my-tf-test-bucket-${terraform.workspace}"
}

इस तरह आपको बाल्टियाँ मिलेंगी

  • मेरी-TF-परीक्षण-बाल्टी-देव
  • मेरी-TF-परीक्षण-बाल्टी-preprod
  • मेरी-TF-परीक्षण-बाल्टी-prod

कार्यस्थानों पर लागू होने के बाद ( terraform workspace select <WORKSPACE>वातावरण बदलने के लिए उपयोग करें)। कोड को बहु-क्षेत्र-प्रूफ बनाने के लिए इसे इस तरह करें:

data "aws_region" "current" {}

resource "aws_s3_bucket" "bucket" {
  bucket = "my-tf-test-bucket-${data.aws_region.current.name}-${terraform.workspace}"
}

पाने के लिए (हमारे लिए पूर्व -1 क्षेत्र)

  • मेरी-TF-परीक्षण-बाल्टी-हमें पूर्व-1-देव
  • मेरी-TF-परीक्षण-बाल्टी-हमें पूर्व-1-preprod
  • मेरी-TF-परीक्षण-बाल्टी-हमें पूर्व-1-prod

0

कुछ टेराफॉर्म बेस्ट प्रैक्टिस फॉलो करने के लिए:

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

    account_number = "123456789012" account_alias = "mycompany"

  2. एक डॉक कंटेनर से टेराफॉर्म को चलाएं: टेराफॉर्म एक आधिकारिक डॉकटर कंटेनर जारी करता है जो आपको आसानी से नियंत्रित करने की अनुमति देता है कि आप किस संस्करण को चला सकते हैं।

जब आप सीआई / सीडी पाइपलाइन में अपना निर्माण कार्य सेट करते हैं तो टेराफॉर्म डॉकटर कंटेनर को चलाने की सिफारिश की जाती है।

TERRAFORM_IMAGE=hashicorp/terraform:0.11.7
TERRAFORM_CMD="docker run -ti --rm -w /app -v ${HOME}/.aws:/root/.aws -v ${HOME}/.ssh:/root/.ssh -v `pwd`:/app $TERRAFORM_IMAGE"

अधिक जानकारी के लिए, कृपया मेरे ब्लॉग का संदर्भ लें: https://medium.com/tech-darwinbox/how-darwinbox-manages-infrastructure-at-scale-with-terraform-371e2c5f04d3


0

मैं इस धागे में योगदान देना चाहता हूं।

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

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

एक चेक अब सर्वोत्तम प्रथाओं ब्लॉग सीआई / सीडी पाइपलाइनों के लिए दिशा निर्देश सहित विवरण में है कि कवर यह।


-1

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

जैसा कि येवगेनी ब्रिकमैन ने उल्लेख किया है कि मॉड्यूल संरचना होना बेहतर है।


-1

ऊपर दिए गए सलाह के साथ, प्रबंधन और राज्यों को बचाने के लिए टेराफॉर्म क्लाउड का उपयोग करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.