एक वेरिएबल को मजबूती से टाइप करें।
→प्रिमिटिव: `string`, `number`, `bool`। संग्रह: `list(<type>)`, `set(<type>)`, `map(<type>)`। संरचनात्मक: `object({...})`, `tuple([...])`। `any` का उपयोग तभी करें जब वास्तव में पॉलीमोर्फिक हो।
संदर्भ↗
`environment` को dev/staging/prod तक प्रतिबंधित करें।
→`variable "environment" { validation { condition = contains(["dev","staging","prod"], var.environment); error_message = "..." } }`। कई `validation` ब्लॉक की अनुमति है; सभी को पास होना चाहिए।
संदर्भ↗
`terraform output` में दिखाई दिए बिना एक डेटाबेस पासवर्ड आउटपुट करें।
→`output "db_password" { value = ...; sensitive = true }`। CLI `(sensitive value)` दिखाता है। अभी भी `terraform output db_password` या `-json` के माध्यम से पठनीय (जानबूझकर - स्क्रिप्ट के लिए)।
संदर्भ↗
एक मान को एक बार कंप्यूट करें और इसे कई संसाधनों में पुन: उपयोग करें।
→`locals { common_tags = merge(var.tags, { Project = var.project }) }`। `local.common_tags` के रूप में संदर्भ। मॉड्यूल के बाहर से ओवरराइड करने योग्य नहीं।
संदर्भ↗
एक मौजूदा AMI को प्रबंधित किए बिना देखें।
→`data "aws_ami" "ubuntu" { most_recent = true; filter { ... } }`। केवल पढ़ने के लिए। विशेषताओं को `data.aws_ami.ubuntu.id` के रूप में संदर्भ दें।
संदर्भ↗
N समान संसाधन बनाएं - `count` या `for_each` चुनें।
→`for_each` (मैप या सेट के साथ) जब आइटम की स्थिर पहचान होती है (क्षेत्र के नाम, पर्यावरण कुंजी)। `count` "मुझे N प्रतियां चाहिए, ऑर्डर मायने नहीं रखता, पहचान सिर्फ एक इंडेक्स है" के लिए। `count` के बीच में जोड़ना/हटाना नष्ट/पुनर्निर्माण का कारण बनता है; `for_each` पहचान को संरक्षित करता है।
संदर्भ↗
स्ट्रिंग की सूची में प्रति आइटम एक संसाधन बनाएं।
→`for_each = toset(["a", "b", "c"])`। `each.key` और `each.value` दोनों स्ट्रिंग देते हैं। मैप्स के लिए: `for_each = var.users` — `each.key` = मैप कुंजी, `each.value` = मैप मान।
संदर्भ↗
एक परिवर्तनीय संख्या में नेस्टेड ब्लॉक उत्पन्न करें (जैसे ingress नियम)।
→`dynamic "ingress" { for_each = var.rules; content { from_port = ingress.value.from; ... } }`। `iterator` आर्गुमेंट यदि आवश्यक हो तो iterator का नाम बदल सकता है।
संदर्भ↗
एक `count` संसाधन के सभी इंस्टेंसेस में विशेषताओं की एक सूची प्राप्त करें।
→`aws_instance.web[*].id` IDs की एक सूची लौटाता है। `count` और `for_each` के साथ काम करता है (लेकिन `for_each` एक अनऑर्डर मैप उत्पन्न करता है, इसलिए `values(aws_instance.web)[*].id`)।
संदर्भ↗
एक शर्त के आधार पर एक मान सेट करें।
→टर्नरी: `var.is_prod ? 5 : 1`। दोनों शाखाओं को समान प्रकार का उत्पादन करना चाहिए।
संदर्भ↗
दो मैप्स को मिलाएं; कुंजी टकराव पर दूसरे के मान जीतते हैं।
→`merge(local.defaults, local.overrides)`। सबसे दाहिना मैप जीतता है। टैग कंपोज़िशन के लिए उपयोगी।
संदर्भ↗
कुंजी गुम होने पर डिफ़ॉल्ट के साथ एक मैप मान पढ़ें।
→`lookup(var.config, "region", "us-east-1")`। कुंजी मौजूद न होने पर डिफ़ॉल्ट लौटाता है। गहरी वैकल्पिक संरचनाओं के लिए, वैकल्पिक `try()` को प्राथमिकता दें।
संदर्भ↗
नेस्टेड सूचियों को एक फ्लैट सूची में संपीड़ित करें।
→`flatten([["a","b"], ["c"], [["d","e"]]])` → `["a","b","c","d","e"]`। सूचियों को पुनरावर्ती रूप से फ्लैट करता है; ऑर्डर को संरक्षित करता है।
संदर्भ↗
एक Terraform मैप को एक IAM नीति दस्तावेज़ में एम्बेड करें।
→`jsonencode({Version = "2012-10-17", Statement = [...]})`। एक JSON स्ट्रिंग उत्पन्न करता है। व्युत्क्रम: `jsondecode()`।
संदर्भ↗
वेरिएबल से मानों के साथ एक टेम्पलेटेड उपयोगकर्ता-डेटा स्क्रिप्ट रेंडर करें।
→`templatefile("init.sh.tpl", { region = var.region, env = var.env })`। टेम्पलेट `${region}` सिंटैक्स का उपयोग करता है। स्टैटिक रेंडरिंग के लिए नया विकल्प: `file()` + `format()`।
संदर्भ↗
एक VPC रेंज से सबनेट CIDRs को निकालें।
→`cidrsubnet("10.0.0.0/16", 8, 0)` → `10.0.0.0/24`। पहला तर्क = पैरेंट, दूसरा = विस्तार करने के लिए बिट्स, तीसरा = सबनेट संख्या।
संदर्भ↗
एक मान पढ़ें जो मौजूद नहीं हो सकता है; डिफ़ॉल्ट पर वापस जाएं।
→`try(yamldecode(file("config.yaml")), { defaults = true })`। बाएं से दाएं मूल्यांकन करता है; पहला गैर-त्रुटिपूर्ण एक्सप्रेशन लौटाता है।
संदर्भ↗
एक ग्लोब से मेल खाने वाली फ़ाइलों पर पुनरावृति करें।
→`fileset(path.module, "configs/*.json")` पथों का एक सेट लौटाता है। प्रति फ़ाइल एक संसाधन का प्रबंधन करने के लिए `for_each` के साथ मिलाएं।
संदर्भ↗
दो क्षेत्रों में एक ही प्रोवाइडर (जैसे AWS us-east-1 + us-west-2)।
→दो `provider "aws" { alias = "..." }` ब्लॉक। संसाधन `provider = aws.us_west` के माध्यम से ऑप्ट इन करते हैं। मॉड्यूल `configuration_aliases` के माध्यम से उपनाम स्वीकार करते हैं।
संदर्भ↗
एक नए बनाए गए VM पर एक शेल कमांड चलाएं।
→एक संसाधन के अंदर `remote-exec` प्रोविज़नर। अंतिम-उपाय उपकरण - क्लाउड-इनिट, उपयोगकर्ता डेटा, या कॉन्फ़िगरेशन प्रबंधन को प्राथमिकता दें। प्रोविज़नर स्टेट में ट्रैक नहीं किए जाते हैं और ड्रिफ्ट पर फिर से नहीं चलते हैं।
संदर्भ↗
एक कमांड चलाएं जो क्लाउड संसाधन से संबंधित नहीं है (जैसे CLI इनवोकेशन)।
→`resource "null_resource" "trigger" { triggers = { sha = sha1(file(".")) }; provisioner "local-exec" { command = "..." } }`। `triggers` बदलने पर फिर से चलता है।
संदर्भ↗
बिना अप्लाई को रोके रनटाइम इनवेरिएंट (जैसे स्वास्थ्य एंडपॉइंट 200 लौटाता है) को लगातार सत्यापित करें।
→`check "endpoint" { data "http" "h" { url = "..." }; assert { condition = data.http.h.status_code == 200; error_message = "..." } }`। प्लान/अप्लाई पर चलता है; विफलता एक चेतावनी है, कोई हार्ड त्रुटि नहीं।
क्यों: `check` स्कोप किए गए डेटा स्रोतों की अनुमति देता है जो केवल चेक के अंदर उपयोग करने योग्य हैं। `precondition`/`postcondition` प्लान/अप्लाई पर हार्ड त्रुटियां हैं।
संदर्भ↗
यदि एक AMI बहुत पुराना है तो प्लान को विफल करें।
→`lifecycle { precondition { condition = data.aws_ami.x.creation_date > "2024-01-01"; error_message = "..." } }`। हार्ड विफल, उपयुक्त के रूप में पहले/बाद में मूल्यांकन किया गया।
संदर्भ↗
एक निश्चित-आकार के स्थितिगत मान के साथ वेरिएबल।
→`type = tuple([string, number, bool])` को ठीक तीन तत्वों की आवश्यकता होती है। एक सूची से अलग (सजातीय, परिवर्तनीय लंबाई)।
संदर्भ↗
एक संरचित इनपुट को मजबूती से टाइप करें (जैसे `database = { instance_class = string, allocated_storage = number }`)।
→`type = object({ instance_class = string, allocated_storage = number, multi_az = optional(bool, false) })`। `optional(<type>, <default>)` विशेषताओं को वैकल्पिक बनाता है।
संदर्भ↗
`*.tfvars` फ़ाइलें कैसे लोड होती हैं?
→`terraform.tfvars` और `*.auto.tfvars` स्वचालित रूप से लोड होते हैं (`auto` के लिए लेक्सिकल ऑर्डर)। अन्य नामों के लिए `-var-file=path.tfvars` की आवश्यकता होती है।
संदर्भ↗
एक Terraform मॉड्यूल के लिए स्वचालित परीक्षण लिखें।
→`.tftest.hcl` फ़ाइलें `run "name" { command = plan|apply, assert { condition = ..., error_message = ... } }` के साथ। `command = plan` में कोई साइड-इफेक्ट नहीं होता है; `command = apply` वास्तव में संसाधन बनाता है।
संदर्भ↗
परीक्षण चलाने में वेरिएबल पास करें।
→फ़ाइल-स्तर `variables { ... }` ब्लॉक सभी रन पर लागू होता है। प्रति-रन `variables { ... }` केवल उस रन के लिए ओवरराइड करता है।
संदर्भ↗