टेराफ़ॉर्म कॉन्फ़िगरेशन का परीक्षण कैसे करें?


37

यदि आपके पास एक टेराफ़ॉर्म कॉन्फ़िगरेशन था जिसमें एक मध्यम डिग्री की जटिलता थी, तो आप कॉन्फ़िगरेशन के चारों ओर परीक्षण कैसे लिखेंगे जिसे एक सतत एकीकरण / निरंतर वितरण पाइपलाइन के हिस्से के रूप में निष्पादित किया जा सकता है?

एक उदाहरण के रूप में, आपके पास एक बहु-क्लाउड कॉन्फ़िगरेशन हो सकता है जो निम्नलिखित वांछित स्थिति को निर्दिष्ट करता है:

  • Azure कंटेनर सेवा Azure में Docker होस्ट करने के लिए
  • Azure बूँद संग्रहण
  • एसक्यूएल नीला
  • EC2 कंटेनर सेवा AWS में डॉकर की मेजबानी करने के लिए
  • अमेज़न S3 संग्रहण सेवा
  • अमेज़ॅन RDS SQL सर्वर डेटाबेस

संभावित रूप terraform applyसे खरोंच से ऊपर बना सकते हैं, या आंशिक रूप से तैनात राज्य से उपरोक्त वांछित राज्य में संक्रमण कर सकते हैं।

मुझे पता है कि Terraform अपने कार्य को निष्पादन योजना चरण और आवेदन चरण में विभाजित करता है जो वास्तव में लक्ष्य वास्तुकला में परिवर्तन करता है। क्या इसका उपयोग निष्पादन योजना के खिलाफ परीक्षण लिखने के लिए किया जा सकता है, यदि ऐसा है तो इनको लिखने में मदद करने के लिए रूपरेखाएं हैं?



दिलचस्प वास्तव में, संभवतः योग्य जवाब।
रिचर्ड स्लेटर

मैं अपने आप को
टेराफ़ॉर्म

जवाबों:


20

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

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

यहां क्या रणनीति उपयुक्त है, इस बात पर बहुत कुछ निर्भर करेगा कि आप क्या परीक्षण करना चाहते हैं। उदाहरण के लिए:

  • ऐसे वातावरण में जो वर्चुअल सर्वर को स्पिन कर रहा है, इन सर्वर के परिप्रेक्ष्य से टेस्ट चलाने के लिए सर्वरपेक जैसे टूल का उपयोग किया जा सकता है। इसे या तो कुछ आउट-ऑफ-बैंड प्रक्रिया का उपयोग करके टेराफॉर्म से अलग से चलाया जा सकता है, या remote-execप्रावधान का उपयोग करके टेराफॉर्म के भाग के रूप में लागू किया जा सकता है । यह "सर्वर डेटाबेस तक पहुँच सकता है?" जैसे प्रश्नों के सत्यापन की अनुमति देता है, लेकिन "उदाहरण के लिए पर्याप्त सुरक्षा समूह प्रतिबंधात्मक है?" जैसे प्रश्नों के लिए उपयुक्त नहीं है, क्योंकि अत्यधिक जाँच है कि उदाहरण के बाहर से डेटा तक पहुँचने की आवश्यकता है।

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

  • अधिक मामूली जरूरतों के लिए, कोई यह विश्वास करना चुन सकता है कि टेराफॉर्म राज्य वास्तविकता का एक सटीक प्रतिनिधित्व है (कई मामलों में एक वैध धारणा) और बस सीधे उस पर जोर देता है। यह सरल "लिंट-लाइक" मामलों के लिए सबसे उपयुक्त है, जैसे कि यह सत्यापित करना कि लागत-आवंटन उद्देश्यों के लिए सही संसाधन टैगिंग योजना का पालन किया जा रहा है।

प्रासंगिक टेराफ़ॉर्म गीथब मुद्दे में इस बारे में कुछ और चर्चा की गई है

टेराफॉर्म के नवीनतम संस्करणों में किसी भी गैर-खिलौना एप्लिकेशन के लिए रिमोट बैकएंड का उपयोग करने की दृढ़ता से सिफारिश की जाती है, लेकिन इसका मतलब है कि राज्य का डेटा स्थानीय डिस्क पर सीधे उपलब्ध नहीं है। हालाँकि, इसका एक स्नैपशॉट terraform state pullकमांड का उपयोग करके रिमोट बैकएंड से प्राप्त किया जा सकता है , जो JSON-स्वरूपित स्टेट डेटा को स्टडआउट करने के लिए प्रिंट करता है ताकि इसे कॉलिंग प्रोग्राम द्वारा कैप्चर और पार्स किया जा सके।


12

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


12

हमने हाल ही में इन्फ्रास्ट्रक्चर कोड के परीक्षण के लिए हमारे स्वेत सेना चाकू से खट्टे आतंकवाद को खोला है ।

आज, आप शायद अपने सभी इन्फ्रास्ट्रक्चर कोड को मैन्युअल रूप से परिनियोजित, मान्य और कम करके परीक्षण कर रहे हैं। Terratest आपको इस प्रक्रिया को स्वचालित करने में मदद करता है:

  1. गो में परीक्षण लिखें।
  2. एक वास्तविक वातावरण (जैसे, AWS) में वास्तविक बुनियादी ढांचे (जैसे, सर्वर) को तैनात करने के लिए अपने असली IaC टूल (जैसे, टेराफॉर्म, पैकर, आदि) को निष्पादित करने के लिए टेरटेस्ट में हेल्पर्स का उपयोग करें।
  3. टेरेटेस्ट में हेल्पर्स का उपयोग यह प्रमाणित करने के लिए करें कि HTTP रिक्वेस्ट, एपीआई कॉल, एसएसएच कनेक्शन आदि बनाकर इन्फ्रास्ट्रक्चर सही तरीके से काम करता है।
  4. टेस्टेट के अंत में सब कुछ तैयार करने के लिए टेरेटेस्ट में हेल्पर्स का उपयोग करें।

यहाँ कुछ टेराफ़ॉर्म कोड के लिए एक उदाहरण परीक्षण है:

terraformOptions := &terraform.Options {
  // The path to where your Terraform code is located
  TerraformDir: "../examples/terraform-basic-example",
}

// This will run `terraform init` and `terraform apply` and fail the test if there are any errors
terraform.InitAndApply(t, terraformOptions)

// At the end of the test, run `terraform destroy` to clean up any resources that were created
defer terraform.Destroy(t, terraformOptions)

// Run `terraform output` to get the value of an output variable
instanceUrl := terraform.Output(t, terraformOptions, "instance_url")

// Verify that we get back a 200 OK with the expected text
// It can take a minute or so for the Instance to boot up, so retry a few times
expected := "Hello, World"
maxRetries := 15
timeBetweenRetries := 5 * time.Second
http_helper.HttpGetWithRetry(t, instanceUrl, 200, expected, maxRetries, timeBetweenRetries)

ये एकीकरण परीक्षण हैं, और जो आप परीक्षण कर रहे हैं, उसके आधार पर 5 - 50 मिनट लग सकते हैं। यह तेज़ नहीं है (हालांकि डॉकर और परीक्षण चरणों का उपयोग करके , आप कुछ चीजों को गति दे सकते हैं), और आपको परीक्षणों को विश्वसनीय बनाने के लिए काम करना होगा, लेकिन यह समय के लायक है।

डॉक्स और विभिन्न प्रकार के इन्फ्रास्ट्रक्चर कोड के बहुत सारे उदाहरणों और उनके लिए संबंधित परीक्षणों के लिए सबसे शानदार रेपो देखें


1
मैंने एक ब्लॉग पोस्ट भी लिखी है, जो टेरेटेस्ट के साथ मेरे एक उदाहरण प्रोजेक्ट को और अधिक विस्तार से जांचने के लिए चलता है: Brightfame.co/blogspot …… । यह किसी के लिए भी महत्वपूर्ण हो सकता है। चीयर्स, रोब!
रोब मॉर्गन

टेरेटेस्ट का बड़ा फैन!
jlucktay

7

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

टेराफॉर्म के साथ इंस्पेक का उपयोग करने के तरीके पर क्रिस्टोफ हार्टमैन (इंस्पेक के सह-निर्माता) का एक लेख यहां दिया गया है: https://lollyrock.com/articles/inspec-terraform/


5

Aws-Side में https://github.com/k1LoW/awspec है - यह संभव होना चाहिए, terraform.state और परीक्षण में फ़ीड करने के लिए, wheter terraform सही लागू किया गया।

लेकिन मुझे लगता है, निम्न स्तर पर परीक्षण से परे उपकरण, आपने उपयोग किया, यह शायद एक बेहतर विचार है, यह सोचने के लिए कि पूरे इन्फ्रास्ट्रक्चर का परीक्षण कैसे किया जाए।

हम इस विचार के बारे में यहाँ चर्चा कर रहे हैं:

https://github.com/DomainDrivenArchitecture/dda-cloudspec/blob/development/README.md

आक्रमणकारियों के परीक्षण के लिए, मैं समाधान का उपयोग करने के लिए तैयार नहीं जानता ...

हम कुछ का एक मिश्रण का उपयोग करते हुए प्रयोगों किया terraform plan -out=plan.dumpऔर grepतत्व नामों की अनुपस्थिति के लिए। यहाँ एक और अधिक सुलभ योजना प्रारूप के बारे में चर्चा है: github.com/hashicorp/terraform/issues/11883

लेकिन फिलहाल हम अपने बुनियादी ढांचे के महत्वपूर्ण हिस्सों के लिए एक मैनुअल योजना समीक्षा प्रक्रिया का उपयोग कर रहे हैं।


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

अच्छा बिंदु ... आक्रमणकारियों के परीक्षण के लिए एक खंड जोड़ा गया।
15

0

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

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

  • main.tf परीक्षण चलाएंगे
  • simple_module/outputs.tf कि परीक्षण के तहत एक मॉड्यूल का प्रतिनिधित्व करता है

./main.tf

terraform {
  required_version = ">= 0.12"
}

module "simple_module" {
  source = "./simple_module"
}

locals {
  expected = 1
  got      = module.simple_module.module-returns-1
}

# Test Output
output "expect-1" {
  value = upper(local.expected == local.got)
}

output "expect-other" {
  value = "other" == local.got ? upper(true) : "FALSE. Got ${local.got}"
}

./simple_module/outputs.tf

output "module-returns-1" {
  value = 1
}

परीक्षण चलाएं

terraform init
terraform apply -auto-approve
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

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