मैं मौजूदा AWS इंफ्रास्ट्रक्चर को Terraform में स्थानांतरित करने की स्थिति में भी हूं, ताकि मैं जवाब विकसित करने का लक्ष्य रखूं।
मैं आधिकारिक टेराफ़ॉर्म उदाहरणों और कई परीक्षण और त्रुटि पर भरोसा कर रहा हूं जो उन क्षेत्रों को बाहर करने के लिए हैं जिनमें मैं अनिश्चित रहा हूं।
.tfstate
फ़ाइलें
टेराफॉर्म कॉन्फिगरेशन का उपयोग विभिन्न इन्फ्रास्ट्रक्चर पर कई बॉक्स को व्यवस्थित करने के लिए किया जा सकता है, जिनमें से प्रत्येक का एक अलग राज्य हो सकता है। जैसा कि यह कई लोगों द्वारा चलाया जा सकता है यह राज्य एक केंद्रीकृत स्थान पर होना चाहिए (जैसे S3) लेकिन गिट नहीं ।
इसकी पुष्टि टेराफॉर्म को देखते हुए की जा सकती है .gitignore
।
डेवलपर नियंत्रण
हमारा उद्देश्य पूर्ण ऑडिट (git लॉग) को बनाए रखने के लिए डेवलपर्स को बुनियादी ढाँचे का अधिक नियंत्रण प्रदान करना है और परिवर्तन की जाँच करने (अनुरोधों को स्वीकार करने) की क्षमता है। नए बुनियादी ढांचे के वर्कफ़्लो को ध्यान में रखते हुए
- आम एएमआई का आधार नींव जिसमें पुन: प्रयोज्य मॉड्यूल जैसे कठपुतली शामिल हैं।
- Terraform का उपयोग करके DevOps द्वारा कोर इंफ्रास्ट्रक्चर का प्रावधान।
- डेवलपर्स Git में Terraform कॉन्फ़िगरेशन को आवश्यकतानुसार बदलते हैं (उदाहरणों की संख्या; नया VPC; क्षेत्र / उपलब्धता क्षेत्र आदि के अलावा)।
- Git कॉन्फ़िगरेशन को धकेल दिया गया और DevOps दस्ते के एक सदस्य द्वारा जाँच की जाने वाली पवित्रता के लिए एक पुल अनुरोध प्रस्तुत किया गया।
- यदि अनुमोदित हो, तो निर्माण करने और तैनात करने के लिए 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
मंच के बीच कुछ परिवर्तनों के जोखिम के बिना क्या चलाया जाएगा (हालांकि लॉकिंग इससे मदद करता है)। इस योजना फ़ाइल को हटाने के लिए याद रखें क्योंकि इसमें संभावित रूप से सादे पाठ "गुप्त" चर हो सकते हैं।
कुल मिलाकर हम टेराफॉर्म से बहुत खुश हैं और नई सुविधाओं के साथ सीखना और सुधार करना जारी रखते हैं।