मुख्य सामग्री पर जाएँ

Azure पर Terraform: IaC के लिए एक व्यावहारिक शुरुआती गाइड

यह ट्यूटोरियल दिखाता है कि Azure के साथ Terraform का उपयोग करके इंफ्रास्ट्रक्चर को कैसे ऑटोमेट करें, स्थिरता कैसे बढ़ाएँ, और सुरक्षित, स्केलेबल डिप्लॉयमेंट्स के लिए सर्वोत्तम प्रथाएँ कैसे लागू करें।
· 13 मि॰ पढ़ें

AI के साथ खोजें

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

इस ट्यूटोरियल में, हम Azure के साथ Terraform का उपयोग करने पर ध्यान देंगे। मैं आपको बताऊँगा कि Terraform क्या है, Azure इकोसिस्टम में यह कैसे काम करता है, और व्यावहारिक उदाहरणों के साथ कैसे शुरुआत करें। हम कुछ सर्वोत्तम प्रथाएँ भी कवर करेंगे ताकि आप शुरुआत से ही सुरक्षित और भरोसेमंद डिप्लॉयमेंट बना सकें।

यदि आप Azure इकोसिस्टम में नए हैं, तो यह Azure फंडामेंटल्स ट्रैक कोर सेवाओं और सिद्धांतों का संरचित परिचय देता है।

Azure पर Terraform का उपयोग क्यों करें?

Terraform, HashiCorp द्वारा विकसित, एक ओपन-सोर्स IaC टूल है जो घोषणात्मक सिंटैक्स के माध्यम से क्लाउड इंफ्रास्ट्रक्चर को परिभाषित और प्रबंधित करने देता है। Microsoft Azure के साथ मिलकर, यह वर्चुअल नेटवर्क, VM और डेटाबेस जैसे संसाधनों को मानव-पठनीय कॉन्फ़िगरेशन फ़ाइलों में स्क्रिप्ट करने में सक्षम बनाता है।

Azure के साथ Terraform क्यों? यह स्थिरता, स्केलेबिलिटी, और गति के बारे में है। चाहे आप एक सिंगल VM तैयार कर रहे हों या एक जटिल, मल्टी-टियर एप्लिकेशन का संचालन कर रहे हों, Terraform प्रक्रिया को सरल बनाता है और मानवीय त्रुटि को कम करता है।

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

Azure पर Terraform की मूल अवधारणाएँ

Azure के साथ Terraform का एकीकरण ऐसी सुविधाएँ प्रदान करता है जो इंफ्रास्ट्रक्चर प्रबंधन को सहज और शक्तिशाली बनाती हैं। आइए प्रमुख घटकों और उपलब्ध Terraform संसाधनों के प्रकारों को समझें।

घोषणात्मक इंफ्रास्ट्रक्चर प्रबंधन

Terraform का घोषणात्मक दृष्टिकोण आपको HashiCorp Configuration Language (HCL) का उपयोग करके .tf फ़ाइलों में अपनी Azure इंफ्रास्ट्रक्चर का वांछित रूप परिभाषित करने देता है। 

उदाहरण के लिए, आप एक Azure VM का आकार, लोकेशन और नेटवर्क सेटिंग्स निर्दिष्ट कर सकते हैं, और Terraform उसके निर्माण के कैसे को संभालता है। एक त्वरित नज़र:

resource "azurerm_virtual_machine" "example" {
  name                  = "my-vm"
  location              = "East US"
  resource_group_name   = "my-resource-group"
  vm_size               = "Standard_D2s_v3"
  network_interface_ids = [azurerm_network_interface.example.id]
  # ... other necessary configurations like OS disk, admin details
}

उपरोक्त परिभाषा आईडेम्पोटेंसी सुनिश्चित करती है—एक ही कोड को कई बार चलाने पर भी बिना डुप्लिकेट या त्रुटि के वही परिणाम मिलता है। 

अब, आइए उन मुख्य Terraform अवधारणाओं को विभाजित करें जो इस घोषणात्मक दृष्टिकोण को संभव बनाती हैं।

Terraform स्टेट (.tfstate)

terraform.tfstate फ़ाइल Terraform के घोषणात्मक मॉडल का केंद्र है। यह एक JSON फ़ाइल है जो आपके Azure संसाधनों की वर्तमान स्थिति—क्या डिप्लॉय है, उनकी कॉन्फ़िगरेशन और आपसी संबंध—का रिकॉर्ड रखती है। 

जब आप terraform apply चलाते हैं, तो Terraform आपकी .tf फ़ाइलों (वांछित स्थिति) की तुलना .tfstate फ़ाइल (वास्तविक स्थिति) से करता है ताकि यह निर्धारित कर सके कि कौन से परिवर्तन करने हैं। उदाहरण के लिए, यदि आप अपने कोड में VM का आकार अपडेट करते हैं, तो Terraform .tfstate फ़ाइल की जाँच करता है और Azure में केवल वही एट्रीब्यूट संशोधित करता है। 

आप इस फ़ाइल को लोकली स्टोर कर सकते हैं, लेकिन टीमों के लिए सहयोग और स्टेट लॉकिंग सक्षम करने हेतु Azure Blob Storage का उपयोग करें ताकि टकराव न हों।

Terraform वैरिएबल्स (.tfvars)

वैरिएबल्स आपकी कॉन्फ़िगरेशन को लचीला और पुन: प्रयोज्य बनाते हैं। variables.tf और terraform.tfvars में परिभाषित, ये आपको संसाधन नामों या क्षेत्रों जैसी मानों को पैरामीटराइज़ करने देते हैं। 

उदाहरण के लिए:

# variables.tf
variable "location" {
  type        = string
  default     = "East US"
  description = "The Azure region where resources will be deployed."
}

# terraform.tfvars (for a specific environment, e.g., production)
location = "West US"

# main.tf
resource "azurerm_resource_group" "example" {
  name     = "my-rg"
  location = var.location
}

terraform.tfvars फ़ाइल डिफ़ॉल्ट्स को ओवरराइड करती है, इसलिए आप कोर .tf फ़ाइलों को बदले बिना अलग-अलग क्षेत्रों में वही कोड डिप्लॉय कर सकते हैं। इसे कई परिवेश (जैसे, dev, prod) प्रबंधित करने के लिए उपयोग किया जा सकता है।

Terraform कॉन्फ़िगरेशन फ़ाइलें (.tf)

इन फ़ाइलों में आपका इंफ्रास्ट्रक्चर कोड होता है, जो HCL में लिखा जाता है। ये संसाधन, प्रोवाइडर्स, मॉड्यूल आदि परिभाषित करती हैं। आप इन्हें एकल main.tf में रख सकते हैं या स्पष्टता और बेहतर संगठन के लिए कई फ़ाइलों (जैसे, variables.tf, outputs.tf, network.tf, compute.tf) में विभाजित कर सकते हैं।

Terraform plan

परिवर्तनों को लागू करने से पहले, terraform plan कमांड यह पूर्वावलोकन दिखाता है कि Terraform क्या करेगा—बनाएगा, अपडेट करेगा, या हटाएगा—जो आपकी .tf फ़ाइलों और .tfstate के बीच अंतर पर आधारित होता है। यह एक ड्राई रन जैसा है जो संभावित समस्याओं को पहले ही पकड़ लेता है, प्रस्तावित कार्रवाइयों का विस्तृत सारांश दिखाते हुए।

Terraform apply

terraform apply कमांड terraform plan द्वारा पहचाने गए परिवर्तनों को निष्पादित करता है, Azure को आपकी वांछित स्थिति से मिलाता है और .tfstate फ़ाइल को रिफ्रेश करता है। परिवर्तनों को लागू करने से पहले आपसे पुष्टिकरण माँगा जाएगा, जो एक सेफ्टी नेट प्रदान करता है।

वर्कस्पेस

Terraform वर्कस्पेस आपको एक ही .tf फ़ाइल सेट से कई परिवेश (जैसे, dev, staging, prod) प्रबंधित करने देते हैं। प्रत्येक वर्कस्पेस की अपनी .tfstate फ़ाइल होती है, ताकि आप अलग-अलग कॉन्फ़िगरेशन (जैसे, dev और prod के लिए अलग VM आकार) के साथ समान इंफ्रास्ट्रक्चर डिप्लॉय कर सकें। 

नया वर्कस्पेस बनाने के लिए, आप उपयोग कर सकते हैं:

terraform workspace new production

इसके बाद, आप वर्कस्पेस पर स्विच कर सकते हैं:

terraform workspace select production

मॉड्यूल्स

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

ये अवधारणाएँ—.tfstate, .tfvars, और घोषणात्मक वर्कफ़्लो—मिलकर यह सुनिश्चित करती हैं कि आपकी Azure इंफ्रास्ट्रक्चर पूर्वानुमेय, पुनरुत्पाद्य और प्रबंधित करने में आसान रहे।

स्टेट प्रबंधन और सहयोग

terraform.tfstate फ़ाइल आपकी इंफ्रास्ट्रक्चर की स्थिति को ट्रैक करती है। टीमों के लिए, इसे Azure Blob Storage में स्टोर करना साझा एक्सेस और वर्ज़न कंट्रोल सक्षम करने की एक महत्वपूर्ण सर्वोत्तम प्रथा है। यह रिमोट बैकएंड कॉन्फ़िगरेशन सभी टीम सदस्यों को इंफ्रास्ट्रक्चर का सुसंगत दृश्य प्रदान करता है। 

स्टेट लॉकिंग, जो Azure Blob Storage जैसे कई रिमोट बैकएंड स्वतः प्रदान करते हैं, उस समय टकराव रोकती है जब कई टीम सदस्य एक साथ Terraform कमांड चलाने का प्रयास करते हैं, और डेटा अखंडता सुनिश्चित करती है।

Azure Blob Storage बैकएंड कॉन्फ़िगर करने का एक उदाहरण यहाँ है:

terraform {
  backend "azurerm" {
    resource_group_name  = "my-terraform-state-rg"
    storage_account_name = "mystorageterraformstate"
    container_name  = "tfstate"
    key  = "production/terraform.tfstate" # Path within the container
  }
}

इस कॉन्फ़िगरेशन के साथ terraform init चलाने से पहले, आपको Azure स्टोरेज अकाउंट और कंटेनर को मैन्युअल रूप से या एक अलग Terraform कॉन्फ़िगरेशन के माध्यम से बनाना होगा। यह सेटअप Azure संसाधनों के सुरक्षित, सहयोगात्मक प्रबंधन को सुनिश्चित करता है।

प्रोवाइडर इकोसिस्टम और AzureRM

azurerm प्रोवाइडर Terraform का Azure से पुल है, जो सेवाओं जैसे VM, नेटवर्क और डेटाबेस प्रबंधित करने के लिए HCL को API कॉल में अनुवाद करता है। 

यह सैकड़ों संसाधन प्रकारों का समर्थन करता है, कंप्यूट (azurerm_linux_virtual_machine, azurerm_windows_virtual_machine) से लेकर एनालिटिक्स (azurerm_synapse_workspace) तक। इसकी कुछ विशेषताएँ:

  • विस्तृत कवरेज: Azure की कई सेवाओं का प्रबंधन करें, जिनमें वर्चुअल मशीनें, स्टोरेज अकाउंट, Azure Kubernetes Service (AKS), Azure SQL Database, MongoDB API के साथ Azure Cosmos DB, Azure Functions, और बहुत कुछ शामिल है। azurerm प्रोवाइडर नए Azure सेवाओं और सुविधाओं को उपलब्ध होते ही समर्थन देने के लिए सक्रिय रूप से विकसित किया जाता है।
  • डायनेमिक फ़ंक्शंस: प्रोवाइडर-परिभाषित फ़ंक्शंस का उपयोग अनोखे नाम बनाने (उदा., azurerm_resource_group.example.name) या मौजूदा संसाधनों के विवरण प्राप्त करने के लिए करें (उदा., data.azurerm_virtual_network.existing.id)। इससे कॉन्फ़िगरेशन अधिक डायनेमिक और बुद्धिमान बनते हैं।
  • डेटा सोर्सेज़: azurerm प्रोवाइडर मौजूदा Azure संसाधनों की जानकारी लाने के लिए डेटा सोर्सेज़ का उपयोग करता है। यह विशेष रूप से तब उपयोगी है जब आपको ऐसे संसाधनों का संदर्भ देना हो जिन्हें आपकी वर्तमान Terraform कॉन्फ़िगरेशन ने प्रोविजन नहीं किया। उदाहरण के लिए, आप मौजूदा वर्चुअल नेटवर्क का विवरण प्राप्त कर सकते हैं ताकि नए सबनेट या वर्चुअल मशीनें डिप्लॉय की जा सकें, बिना VNet को फिर से बनाए।

Terraform में कूदने से पहले, Azure को मैन्युअल रूप से कॉन्फ़िगर करना समझना मददगार रहता है—यह शुरुआती गाइड आपको आवश्यकताओं से गुज़ारता है।

Terraform–Azure वातावरण सेट करना

आइए अब हाथों-हाथ काम करें! यह अनुभाग आपको अपनी Azure सब्सक्रिप्शन के साथ Terraform उपयोग करने के लिए आवश्यक प्रारंभिक सेटअप से गुज़ारेगा।

प्रमाणीकरण और CLI टूल्स

Azure से इंटरैक्ट करने के लिए, आपको पहले Azure Command Line Interface (CLI) इंस्टॉल और कॉन्फ़िगर करना होगा। Azure CLI प्रमाणीकरण और आपके Azure संसाधनों को प्रबंधित करने के लिए आवश्यक टूल प्रदान करता है। इंस्टॉलेशन के बाद, अपने Azure अकाउंट में लॉगिन करें:

az login

ऊपर दिया गया कमांड इंटरैक्टिव प्रमाणीकरण के लिए एक ब्राउज़र विंडो खोलेगा। तीव्र संदर्भ के लिए, यह Azure CLI चीट शीट आपके कमांड-लाइन वर्कफ़्लो को सरल बना सकती है।

Terraform के साथ ऑटोमेटेड डिप्लॉयमेंट्स के लिए, खासकर CI/CD पाइपलाइंस में, Azure Active Directory (AAD) सर्विस प्रिंसिपल्स बनाना और उपयोग करना अत्यधिक अनुशंसित है। सर्विस प्रिंसिपल्स Terraform को बिना इंटरैक्टिव लॉगिन के, सुरक्षित और प्रोग्रामेटिक तरीके से आपकी Azure सब्सक्रिप्शन के साथ प्रमाणीकरण करने देते हैं।

सब्सक्रिप्शन स्कोप पर "Contributor" रोल के साथ एक सर्विस प्रिंसिपल बनाने के लिए चलाएँ:

az ad sp create-for-rbac --name "http://myTerraformServicePrincipal" --role "Contributor" --scopes "/subscriptions/<your-subscription-id>"

आउटपुट में appId, password, और tenant (टेनेंट ID) मिलेगा। इसके बाद आप इन्हें Terraform के लिए पर्यावरण वेरिएबल्स के रूप में सेट कर सकते हैं:

export ARM_CLIENT_ID="<appId>"
export ARM_CLIENT_SECRET="<password>"
export ARM_TENANT_ID="<tenant>"
export ARM_SUBSCRIPTION_ID="<your-subscription-id>"

प्रोजेक्ट इनिशियलाइज़ करना

एक सामान्य Terraform प्रोजेक्ट एक संरचित डायरेक्टरी लेआउट का पालन करता है, जिसमें अक्सर अलग-अलग संसाधन प्रकारों या मॉड्यूल्स के लिए अलग .tf फ़ाइलें होती हैं (जैसे, main.tf, variables.tf, outputs.tf, network.tf, compute.tf)। 

किसी भी Terraform प्रोजेक्ट की शुरुआत करने के लिए, अपने प्रोजेक्ट डायरेक्टरी में जाएँ और terraform init कमांड चलाएँ। यह कमांड वर्किंग डायरेक्टरी को इनिशियलाइज़ करता है, आवश्यक प्रोवाइडर प्लगइन्स (जैसे azurerm) डाउनलोड करता है, और आपकी कॉन्फ़िगरेशन में परिभाषित स्टेट मैनेजमेंट के लिए बैकएंड सेट करता है।

mkdir my-azure-terraform-project
cd my-azure-terraform-project
# Create your .tf files here
terraform init

यह कमांड Terraform ऑपरेशंस के लिए आपकी डायरेक्टरी को तैयार करता है, यह सुनिश्चित करते हुए कि सभी आवश्यक प्लगइन्स उपलब्ध हों।

Azure संसाधनों का प्रोविजनिंग

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

वर्चुअल नेटवर्क और सबनेट्स

Terraform Azure पर नेटवर्क इंफ्रास्ट्रक्चर परिभाषित और डिप्लॉय करने में उत्कृष्ट है। आप आसानी से वर्चुअल नेटवर्क (VNet) परिभाषित कर सकते हैं और उन्हें सबनेट्स में विभाजित कर सकते हैं, IP एड्रेस स्पेस और नेटवर्क आइसोलेशन को नियंत्रित करते हुए। 

Terraform की अंतर्निहित डिपेंडेंसी मैनेजमेंट यह सुनिश्चित करती है कि संसाधन सही क्रम में बनाए जाएँ; उदाहरण के लिए, सबनेट्स तभी प्रोविजन होंगे जब उनका पैरेंट VNet सफलतापूर्वक बन चुका होगा। यहाँ एक उदाहरण है:

resource "azurerm_resource_group" "network_rg" {
  name     = "my-network-rg"
  location = "East US"
}

resource "azurerm_virtual_network" "main_vnet" {
  name                = "my-vnet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.network_rg.location
  resource_group_name = azurerm_resource_group.network_rg.name
}

resource "azurerm_subnet" "web_subnet" {
  name                 = "web-subnet"
  resource_group_name  = azurerm_resource_group.network_rg.name
  virtual_network_name = azurerm_virtual_network.main_vnet.name
  address_prefixes     = ["10.0.1.0/24"]
}

resource "azurerm_subnet" "app_subnet" {
  name                 = "app-subnet"
  resource_group_name  = azurerm_resource_group.network_rg.name
  virtual_network_name = azurerm_virtual_network.main_vnet.name
  address_prefixes     = ["10.0.2.0/24"]
}

क्लाउड-इनिट के साथ वर्चुअल मशीनें

Terraform के साथ वर्चुअल मशीनें (VMs) प्रोविजन करना सीधा है। पोस्ट-डिप्लॉयमेंट कॉन्फ़िगरेशन और प्रारंभिक सेटअप को स्वचालित करने के लिए, आप cloud-init स्क्रिप्ट्स का लाभ उठा सकते हैं। 

cloud-init आपको ऐसी स्क्रिप्ट इंजेक्ट करने देता है जो VM के पहले बूट पर चलती हैं, जिससे आप सीधे अपनी Terraform कॉन्फ़िगरेशन से सॉफ़्टवेयर इंस्टॉल करना, उपयोगकर्ता कॉन्फ़िगर करना, या सेवाएँ सेटअप करना जैसे कार्य कर सकते हैं।

यहाँ Nginx इंस्टॉल करने के लिए एक साधारण cloud-init स्क्रिप्ट के साथ एक Linux VM प्रोविजन करने का उदाहरण है:

resource "azurerm_resource_group" "vm_rg" {
  name     = "my-vm-rg"
  location = "East US"
}

resource "azurerm_network_interface" "vm_nic" {
  name                = "my-vm-nic"
  location            = azurerm_resource_group.vm_rg.location
  resource_group_name = azurerm_resource_group.vm_rg.name

  ip_configuration {
    name                          = "internal"
    subnet_id                     = azurerm_subnet.web_subnet.id # Assuming web_subnet defined above
    private_ip_address_allocation = "Dynamic"
    public_ip_address_id          = azurerm_public_ip.vm_public_ip.id
  }
}

resource "azurerm_public_ip" "vm_public_ip" {
  name                = "my-vm-public-ip"
  location            = azurerm_resource_group.vm_rg.location
  resource_group_name = azurerm_resource_group.vm_rg.name
  allocation_method   = "Static"
}

resource "azurerm_linux_virtual_machine" "my_vm" {
  name                  = "my-linux-vm"
  location              = azurerm_resource_group.vm_rg.location
  resource_group_name   = azurerm_resource_group.vm_rg.name
  size                  = "Standard_B2s"
  admin_username        = "azureuser"
  admin_password        = "P@ssw0rd1234!" # In a real scenario, use Azure Key Vault or variables
  network_interface_ids = [azurerm_network_interface.vm_nic.id]

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

  source_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "18.04-LTS"
    version   = "latest"
  }

  # cloud-init script to install Nginx
  custom_data = base64encode(<<EOF
#cloud-config
packages:
  - nginx
runcmd:
  - systemctl start nginx
  - systemctl enable nginx
EOF
  )
}

इंफ्रास्ट्रक्चर का मॉड्यूलराइजेशन

जैसे-जैसे आपकी Azure इंफ्रास्ट्रक्चर बढ़ती है, Terraform कॉन्फ़िगरेशन का मॉड्यूलराइजेशन पुन: उपयोग, अनुरक्षण और स्केलेबिलिटी के लिए महत्वपूर्ण हो जाता है। 

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

उदाहरण: मॉड्यूल संरचना (modules/web-app/main.tf):

# modules/web-app/main.tf
resource "azurerm_app_service_plan" "app_plan" {
  name                = var.app_service_plan_name
  location            = var.location
  resource_group_name = var.resource_group_name
  kind                = "Linux"
  sku {
    tier = "Basic"
    size = "B1"
  }
}

resource "azurerm_app_service" "app_service" {
  name                = var.app_service_name
  location            = var.location
  resource_group_name = var.resource_group_name
  app_service_plan_id = azurerm_app_service_plan.app_plan.id
}

variable "app_service_plan_name" {
  type = string
}

variable "app_service_name" {
  type = string
}

variable "location" {
  type = string
}

variable "resource_group_name" {
  type = string
}

output "app_service_default_hostname" {
  value = azurerm_app_service.app_service.default_host_name
}

उदाहरण: मॉड्यूल इनवोक करना (रूट डायरेक्टरी में main.tf):

resource "azurerm_resource_group" "app_rg" {
  name     = "my-webapp-rg"
  location = "East US"
}

module "my_web_app" {
  source                = "./modules/web-app" # Path to your module
  app_service_plan_name = "my-webapp-plan"
  app_service_name      = "my-unique-webapp-2025"
  location              = azurerm_resource_group.app_rg.location
  resource_group_name   = azurerm_resource_group.app_rg.name
}

output "webapp_url" {
  value = module.my_web_app.app_service_default_hostname
}

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

एडवांस्ड Terraform वर्कफ़्लो

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

डेटा सोर्सेज़ और डायनेमिक कॉन्फ़िगरेशन

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

डायनेमिक कॉन्फ़िगरेशन (जैसे for_each और count) के साथ मिलकर, डेटा सोर्सेज़ अत्यंत लचीले और अनुकूलनशील Terraform स्क्रिप्ट सक्षम करती हैं जो विभिन्न परिस्थितियों और संसाधन उपलब्धता पर प्रतिक्रिया दे सकें।

उदाहरण: मौजूदा VNet ढूँढने और नया सबनेट जोड़ने के लिए डेटा सोर्स का उपयोग:

# Data source to fetch an existing Virtual Network
data "azurerm_virtual_network" "existing_vnet" {
  name                = "production-vnet"
  resource_group_name = "production-network-rg"
}

# Create a new subnet within the existing VNet
resource "azurerm_subnet" "new_app_subnet" {
  name                 = "new-app-subnet"
  resource_group_name  = data.azurerm_virtual_network.existing_vnet.resource_group_name
  virtual_network_name = data.azurerm_virtual_network.existing_vnet.name
  address_prefixes     = ["10.0.3.0/24"]
}

उदाहरण: for_each और एक मैप वैरिएबल का उपयोग कर कई VMs का डायनेमिक निर्माण:

variable "vm_configs" {
  type = map(object({
    size = string
    ip   = string
  }))
  default = {
    "web-server-01" = { size = "Standard_B1s", ip = "10.0.1.10" },
    "web-server-02" = { size = "Standard_B1s", ip = "10.0.1.11" }
  }
}

resource "azurerm_linux_virtual_machine" "web_servers" {
  for_each              = var.vm_configs
  name                  = each.key
  location              = azurerm_resource_group.main_rg.location
  resource_group_name   = azurerm_resource_group.main_rg.name
  size                  = each.value.size
  admin_username        = "azureuser"
  admin_password        = "StrongPassword!123" # Use Key Vault in production
  network_interface_ids = [azurerm_network_interface.web_servers_nic[each.key].id]

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

  source_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "18.04-LTS"
    version   = "latest"
  }
}

resource "azurerm_network_interface" "web_servers_nic" {
  for_each            = var.vm_configs
  name                = "${each.key}-nic"
  location            = azurerm_resource_group.main_rg.location
  resource_group_name = azurerm_resource_group.main_rg.name

  ip_configuration {
    name                          = "internal"
    subnet_id                     = azurerm_subnet.web_subnet.id
    private_ip_address_allocation = "Static"
    private_ip_address            = each.value.ip
  }
}

Sentinel के साथ पॉलिसी-एज़-कोड

जिन संगठनों को कड़े कंप्लायंस और गवर्नेंस की आवश्यकता होती है, उनके लिए HashiCorp Sentinel एक पॉलिसी-एज़-कोड फ़्रेमवर्क प्रदान करता है जो Terraform Enterprise के साथ एकीकृत होता है (या Terraform Cloud के साथ कस्टम उपयोग के लिए अनुकूलित किया जा सकता है)। 

Sentinel आपको सूक्ष्म नीतियाँ परिभाषित करने देता है जो सुरक्षा, लागत और ऑपरेशनल सर्वोत्तम प्रथाओं को पहले से लागू कर देती हैं, यानी इंफ्रास्ट्रक्चर प्रोविजन होने से पहले। 

उदाहरण के लिए, एक पॉलिसी किसी निश्चित आकार से बड़े VMs के निर्माण को रोक सकती है या यह सुनिश्चित कर सकती है कि सभी संसाधनों में विशेष टैग हों। प्रीबिल्ट नीतियाँ कंप्लायंस मानकों को लागू कर सकती हैं, जिससे गैर-अनुपालन डिप्लॉयमेंट आपके Azure वातावरण तक पहुँचने से पहले ही रुक जाएँ।

लागत अनुकूलन रणनीतियाँ

Terraform, Azure Policy के साथ मिलकर, आपके Azure वातावरण में लागत नियंत्रण लागू करने के लिए एक शक्तिशाली साधन हो सकता है। 

ऐसी Azure पॉलिसीज़ परिभाषित करके जो संसाधन SKU को सीमित करती हैं, लागत आवंटन के लिए टैगिंग लागू करती हैं, या महंगे संसाधनों के डिप्लॉयमेंट को रोकती हैं, आप सीधे अपने IaC वर्कफ़्लो में प्रभावी लागत-बचत उपाय लागू कर सकते हैं। 

Terraform Azure पॉलिसीज़ को डिप्लॉय और प्रबंधित भी कर सकता है, यह सुनिश्चित करते हुए कि आपकी गवर्नेंस नियम वर्ज़न-कंट्रोल में रहें और लगातार लागू हों।

उदाहरण: Terraform के साथ Azure पॉलिसी डेफिनिशन डिप्लॉय करना:

resource "azurerm_resource_group" "policy_rg" {
  name     = "azure-policy-rg"
  location = "global" # Policies are global resources
}

resource "azurerm_policy_definition" "deny_large_vms" {
  name         = "deny-large-vm-skus"
  policy_type  = "Custom"
  mode         = "All"
  display_name = "Deny creation of large VM SKUs (E-series)"
  description  = "This policy denies the creation of Azure Virtual Machines with SKUs from the E-series for cost management."

  policy_rule = <<POLICY_RULE
{
  "if": {
    "allOf": [
      {
        "field": "type",
        "equals": "Microsoft.Compute/virtualMachines"
      },
      {
        "field": "Microsoft.Compute/virtualMachines/sku.name",
        "like": "Standard_E*"
      }
    ]
  },
  "then": {
    "effect": "deny"
  }
}
POLICY_RULE
}

resource "azurerm_policy_assignment" "deny_large_vms_assignment" {
  name                 = "deny-large-vm-skus-assignment"
  scope                = "/subscriptions/${data.azurerm_subscription.current.id}" # Assign to entire subscription
  policy_definition_id = azurerm_policy_definition.deny_large_vms.id
  display_name         = "Deny large VM SKUs"
}

data "azurerm_subscription" "current" {}

यह संयोजन आपको संगठनात्मक लागत नीतियों को स्वचालित रूप से लागू करने देता है, अत्यधिक खर्च को रोकते हुए संसाधन दक्षता को बढ़ावा देता है।

CI/CD एकीकरण

यह अनुभाग आपके Terraform को Continuous Integration/Continuous Delivery (CI/CD) पाइपलाइंस में एकीकृत करने पर केंद्रित है, ताकि डिप्लॉयमेंट स्वचालित और भरोसेमंद बनें, और इंफ्रास्ट्रक्चर परिवर्तन आपके सॉफ़्टवेयर विकास जीवनचक्र का सहज हिस्सा बन जाएँ।

Azure DevOps पाइपलाइंस

Azure DevOps CI/CD पाइपलाइंस बनाने के लिए एक मज़बूत प्लेटफ़ॉर्म प्रदान करता है। एक सामान्य वर्कफ़्लो में ये चरण शामिल होते हैं:

  1. Initialize: प्रोवाइडर्स डाउनलोड करने और बैकएंड सेटअप के लिए terraform init।
  2. Plan: एक्ज़ीक्यूशन प्लान बनाने और सहेजने के लिए terraform plan -out।
  3. Review (मैन्युअल अनुमोदन): एक चरण जिसमें जेनरेटेड प्लान को लागू करने से पहले किसी व्यक्ति द्वारा समीक्षा और अनुमोदित किया जाता है।
  4. Apply: परिवर्तनों को निष्पादित करने के लिए terraform apply tfplan।

आप यह भी देख सकते हैं कि Azure DevOps एप्लिकेशन डिप्लॉयमेंट के लिए एंड-टू-एंड CI/CD वर्कफ़्लोज़ को कैसे सपोर्ट करता है—यह हैंड्स-ऑन ट्यूटोरियल देखें।

GitHub Actions

GitHub Actions आपके GitHub रिपॉज़िटरी के भीतर सीधे आपके Terraform वर्कफ़्लोज़ को ऑटोमेट करने का लचीला और शक्तिशाली तरीका प्रदान करता है। यह YAML फ़ाइलों का उपयोग करता है जो push या pull request जैसे इवेंट्स पर प्रतिक्रिया देने वाले वर्कफ़्लोज़ को परिभाषित करती हैं।

GitHub Actions का उपयोग करते हुए एक बेसिक Terraform डिप्लॉयमेंट के लिए चरण:

  1. वर्कफ़्लो ट्रिगर परिभाषित करें: आमतौर पर किसी विशिष्ट ब्रांच (उदा., main) पर on: push।
  2. कोड चेकआउट करें: actions/checkout@v3 का उपयोग करें।
  3. Azure क्रेडेंशियल्स कॉन्फ़िगर करें: GitHub Secrets का उपयोग कर पर्यावरण वेरिएबल्स सेट करें (उदा., AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_TENANT_ID, AZURE_SUBSCRIPTION_ID)।
  4. Terraform इंस्टॉल करें: hashicorp/setup-terraform@v2 का उपयोग करें।
  5. Terraform init: वर्किंग डायरेक्टरी इनिशियलाइज़ करें।
  6. Terraform plan: एक्ज़ीक्यूशन प्लान बनाएँ और आउटपुट करें।
  7. Terraform apply (शर्तीय): परिवर्तनों को लागू करें, अक्सर मैन्युअल अनुमोदन चरण या किसी विशिष्ट ब्रांच पर निर्भर।

उदाहरण: GitHub Actions वर्कफ़्लो के लिए YAML (.github/workflows/terraform-azure.yml):

name: 'Terraform Azure CI/CD'

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

env:
  ARM_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
  ARM_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
  ARM_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
  ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
  TF_STATE_RG: 'my-terraform-state-rg'
  TF_STATE_SA: 'mystorageterraformstate'
  TF_STATE_CONTAINER: 'tfstate'
  TF_STATE_KEY: 'production/terraform.tfstate'

jobs:
  terraform:
    name: 'Terraform Actions'
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: './terraform' # Assuming Terraform files are in a 'terraform' folder

    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v2
      - name: Terraform Init
        id: init
        run: terraform init -backend-config="resource_group_name=${{ env.TF_STATE_RG }}" -backend-config="storage_account_name=${{ env.TF_STATE_SA }}" -backend-config="container_name=${{ env.TF_STATE_CONTAINER }}" -backend-config="key=${{ env.TF_STATE_KEY }}"
      - name: Terraform Plan
        id: plan
        run: terraform plan -no-color
      - name: Terraform Apply
        if: github.ref == 'refs/heads/main' && github.event_name == 'push'
        run: terraform apply -auto-approve

सुरक्षा और अनुपालन

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

Azure Key Vault एकीकरण

API की, कनेक्शन स्ट्रिंग्स, डेटाबेस क्रेडेंशियल्स और सर्टिफिकेट जैसे संवेदनशील डेटा को अपनी Terraform कॉन्फ़िगरेशन के भीतर प्रबंधित करना, यदि ठीक से न किया जाए तो जोखिमपूर्ण हो सकता है। Azure Key Vault सीक्रेट्स, कीज़ और सर्टिफिकेट्स स्टोर और प्रबंधित करने के लिए एक सुरक्षित, केंद्रीकृत समाधान प्रदान करता है। 

उदाहरण: Key Vault से डेटाबेस पासवर्ड प्राप्त करना:

# Data source to retrieve an existing Azure Key Vault
data "azurerm_key_vault" "my_key_vault" {
  name                = "my-secure-keyvault"
  resource_group_name = "my-secrets-rg"
}

# Data source to retrieve a specific secret from the Key Vault
data "azurerm_key_vault_secret" "db_password" {
  name         = "DbPassword"
  key_vault_id = data.azurerm_key_vault.my_key_vault.id
}

resource "azurerm_sql_server" "example" {
  administrator_login          = "sqladmin"
  administrator_login_password = data.azurerm_key_vault_secret.db_password.value # Securely retrieve password
}

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

नेटवर्क सिक्योरिटी ग्रुप्स (NSGs)

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

उदाहरण: वेब एप्लिकेशन के लिए NSG कॉन्फ़िगर करना:

resource "azurerm_network_security_group" "web_nsg" {
  name                = "web-nsg"
  location            = azurerm_resource_group.network_rg.location
  resource_group_name = azurerm_resource_group.network_rg.name

  security_rule {
    name                       = "AllowHTTPInbound"
    priority                   = 100
    direction                  = "Inbound"
    access                     = "Allow"
    protocol                   = "Tcp"
    source_port_range          = "*"
    destination_port_range     = "80"
    source_address_prefix      = "Internet"
    destination_address_prefix = "*"
  }
  security_rule {
    name                       = "AllowSSHInbound"
    priority                   = 120
    direction                  = "Inbound"
    access                     = "Allow"
    protocol                   = "Tcp"
    source_port_range          = "*"
    destination_port_range     = "22"
    source_address_prefix      = "YourTrustedIPRange" # IMPORTANT: Restrict to known IPs
    destination_address_prefix = "*"
  }
}

# Associate NSG with a subnet 
resource "azurerm_subnet_network_security_group_association" "web_subnet_nsg_association" {
  subnet_id                 = azurerm_subnet.web_subnet.id
  network_security_group_id = azurerm_network_security_group.web_nsg.id
}

एंटरप्राइज़ डिप्लॉयमेंट्स के लिए सर्वोत्तम प्रथाएँ

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

रेफ़रेंस आर्किटेक्चर

मजबूत और कुशल Azure डिप्लॉयमेंट्स के लिए, अपनी Terraform कॉन्फ़िगरेशनों को Azure Well-Architected Framework के अनुरूप बनाएँ। यह फ़्रेमवर्क उच्च-गुणवत्ता, सुरक्षित, लागत-प्रभावी क्लाउड समाधानों को डिज़ाइन करने के लिए ब्लूप्रिंट प्रदान करता है, और विश्वसनीयता, सुरक्षा, लागत अनुकूलन, ऑपरेशनल उत्कृष्टता और प्रदर्शन दक्षता के लिए आपके Terraform डिज़ाइनों का मार्गदर्शन करता है।

स्टेट फ़ाइल हाइजीन

Terraform स्टेट फ़ाइल आपकी इंफ्रास्ट्रक्चर की एकमात्र सत्य-स्रोत है। इसकी अखंडता और सुरक्षा सुनिश्चित करें:

  • रिमोट स्टोरेज: सहयोगात्मक स्टेट मैनेजमेंट के लिए हमेशा Azure Blob Storage जैसे रिमोट बैकएंड का उपयोग करें।
  • एन्क्रिप्शन और एक्सेस कंट्रोल: सुनिश्चित करें कि आपका रिमोट स्टेट at-rest एन्क्रिप्टेड हो और एक्सेस सीमित करने के लिए सख्त Azure RBAC लागू हो।
  • स्टेट लॉकिंग और वर्ज़निंग: टकराव रोकने के लिए बिल्ट-इन स्टेट लॉकिंग का लाभ लें और ऐतिहासिक ट्रैकिंग तथा रिकवरी के लिए अपने स्टोरेज कंटेनर पर वर्ज़निंग सक्षम करें।

मॉनिटरिंग और ड्रिफ्ट डिटेक्शन

"कॉन्फ़िगरेशन ड्रिफ्ट"—आपकी परिभाषित Terraform स्थिति से बिना अनुमति विचलन—का सक्रिय रूप से मॉनिटरिंग करके इंफ्रास्ट्रक्चर स्थिरता बनाए रखें।

  • प्रोएक्टिव डिटेक्शन: अपने CI/CD पाइपलाइंस में (उदा., नाइटली) नियमित terraform plan रन लागू करें ताकि परिवर्तनों की पहचान हो सके।
  • Azure मॉनिटरिंग: संसाधन स्वास्थ्य और इवेंट्स को ट्रैक करने के लिए Azure Monitor और Log Analytics का उपयोग करें।
  • स्वचालित प्रत्यास्थापन: ड्रिफ्टेड संसाधनों को आपकी IaC के अनुरूप वापस लाने के लिए terraform apply को फिर से चलाने हेतु प्रक्रियाएँ (मैन्युअल या स्वचालित) विकसित करें।

अपनी इंफ्रास्ट्रक्चर की और निगरानी और अनुकूलन के लिए, Azure Monitor मूल्यवान इंसाइट्स प्रदान करता है—यह गाइड बताता है कि कैसे शुरुआत करें।

निष्कर्ष

यही समापन है! अब तक आपने देखा कि Terraform Azure संसाधनों के प्रबंधन को कितना अधिक कुशल और पूर्वानुमेय बना सकता है। हमने CI/CD टूल्स जैसे Azure DevOps और GitHub Actions के साथ अपने वर्कफ़्लो में ऑटोमेशन लाने के तरीके देखे, और Azure Key Vault तथा Network Security Groups जैसी सुविधाओं के साथ सुरक्षा बनाए रखने के तरीके भी।

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

इन टूल्स और टिप्स के साथ, आप Azure पर अधिक विश्वसनीय और स्केलेबल इंफ्रास्ट्रक्चर बनाने की राह पर अच्छी तरह आगे बढ़ चुके हैं।

अपनी स्किल्स को मान्य करना चाहते हैं? ये Terraform इंटरव्यू प्रश्न आपको जॉब अवसरों या सर्टिफिकेशन की तैयारी में मदद कर सकते हैं!

FAQs

Azure के साथ Terraform का उपयोग करने के प्राथमिक लाभ क्या हैं?

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

Terraform मेरी Azure इंफ्रास्ट्रक्चर की स्टेट को कैसे मैनेज करता है?

Terraform आपके डिप्लॉय किए गए Azure संसाधनों को ट्रैक करने के लिए एक स्टेट फ़ाइल (.tfstate) का उपयोग करता है। यह फ़ाइल आपकी Terraform कॉन्फ़िगरेशंस को वास्तविक इंफ्रास्ट्रक्चर से मैप करती है, जिससे Terraform वर्तमान स्थिति समझ पाता है और बाद के डिप्लॉयमेंट्स के दौरान आवश्यक परिवर्तनों का निर्धारण कर पाता है।

क्या मैं Terraform का उपयोग नई इंफ्रास्ट्रक्चर डिप्लॉयमेंट के साथ-साथ मौजूदा Azure संसाधनों के प्रबंधन के लिए भी कर सकता/सकती हूँ?

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

Azure डिप्लॉयमेंट्स के लिए Terraform CI/CD पाइपलाइंस में कैसे इंटीग्रेट होता है?

Terraform Azure DevOps Pipelines और GitHub Actions जैसे लोकप्रिय CI/CD प्लेटफ़ॉर्म्स के साथ एकीकृत होता है। आमतौर पर, Azure डिप्लॉयमेंट्स के लिए Terraform की CI/CD पाइपलाइन में terraform init (इनिशियलाइज़ेशन), terraform plan (प्रस्तावित परिवर्तन दिखाना), और terraform apply (परिवर्तन Azure पर लागू करना) जैसे चरण शामिल होते हैं। यह ऑटोमेशन स्थिर और विश्वसनीय इंफ्रास्ट्रक्चर डिप्लॉयमेंट सुनिश्चित करता है।

Azure पर Terraform का उपयोग करते समय कुछ प्रमुख सुरक्षा विचार क्या हैं?

मुख्य विचारों में Azure Key Vault का उपयोग करके संवेदनशील डेटा (जैसे API की या पासवर्ड) को सुरक्षित रूप से प्रबंधित करना शामिल है, बजाय उन्हें हार्डकोड करने के। इसके अलावा, नेटवर्क ट्रैफ़िक नियंत्रित करने और Azure संसाधनों तक न्यूनतम-आवश्यकता एक्सेस लागू करने के लिए Terraform के माध्यम से Network Security Groups (NSGs) का ठीक से कॉन्फ़िगर करना अत्यंत महत्वपूर्ण है।

Karen Zhang

लेखक

Karen Zhang

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

विषय