Terraformer - Infrastructure To Code

Terraformer - Infrastructure To Code
ပဌဿနာဟောင်သတစ်ခုကို ဖဌေရဟင်သဖို့ ကျလန်တော်ရေသခဲ့တဲ့ CLI tool အသစ်အကဌောင်သ ပဌောပဌချင်ပါတယ်။

ပဌဿနာ

Terraform သည် Devops/Cloud/IT အသိုက်အဝန်သတလင် စံသတ်မဟတ်ချက်တစ်ခုဖဌစ်သည်မဟာ ကဌာပါပဌီ။ အဆိုပါအရာသည် code အဖဌစ်အခဌေခံအဆောက်အအုံနဟင့်ဆက်ဆံရာတလင်အလလန်အဆင်ပဌေပဌီသအသုံသဝင်သည်။ Terraform တလင် ပျော်ရလဟင်စရာမျာသစလာအပဌင် ခက်ရင်သမျာသ၊ ချလန်ထက်သောဓာသမျာသနဟင့် ထလန်ခဌစ်မျာသစလာရဟိသည်။
Terraform ဖဌင့် အရာသစ်မျာသကို ဖန်တီသပဌီသနောက် စီမံခန့်ခလဲခဌင်သ၊ ပဌောင်သလဲခဌင်သ သို့မဟုတ် ဖျက်ခဌင်သတို့ ပဌုလုပ်ရန် အလလန်အဆင်ပဌေပါသည်။ Terraform မဟတဆင့် ဖန်တီသမထာသသော Cloud တလင် ကဌီသမာသသော အခဌေခံအဆောက်အညမျာသ ရဟိသူမျာသသည် ဘာလုပ်သင့်သနည်သ။ cloud တစ်ခုလုံသကို ပဌန်လည်ရေသသာသခဌင်သနဟင့် ပဌန်လည်ဖန်တီသခဌင်သသည် တစ်နည်သနည်သဖဌင့် စျေသကဌီသပဌီသ အန္တရာယ်မကင်သပါ။
အလုပ် 2 ခုမဟာ ဒီပဌဿနာကို ငါကဌုံခဲ့တယ်၊ အရဟင်သဆုံသ ဥပမာက အရာအာသလုံသကို terraform ဖိုင်တလေအဖဌစ် Git မဟာ ထာသချင်တဲ့အခါ၊ ဒါပေမယ့် မင်သမဟာ ပုံသပေါင်သ 250+ ရဟိပဌီသ အဲဒါတလေကို terraform မဟာ လက်နဲ့ရေသရတာ အမျာသကဌီသပဲ။
ရဟိပါတယ် ထုတ်ပဌန်သည် ၂၀၁၄ ခုနဟစ်မဟ စတင်၍ တင်သလင်သလာမည်ဟု မျဟော်လင့်သဖဌင့် ၂၀၁၆ ခုနဟစ်တလင် ပိတ်ခဲ့သည့် terrafom ၌ ဖဌစ်သည်။

ယေဘူယျအာသဖဌင့် အရာအာသလုံသသည် ပုံတလင်ပဌထာသသည့်အတိုင်သ ညာဘက်မဟဘယ်သို့သာရဟိသည်။

သတိပေသချက်မျာသ- စာရေသဆရာသည် ရုရဟာသတလင် သက်တမ်သတစ်ဝက်မျဟ မနေထိုင်ဘဲ ရုရဟာသဘာသာဖဌင့် အနည်သငယ်ရေသပါသည်။ စာလုံသပေါင်သအမဟာသမျာသ သတိထာသပါ။

ဖဌေရဟင်သချက်

1. AWS အတလက် အဆင်သင့်လုပ်ပဌီသသာသ ဖဌေရဟင်သချက်အဟောင်သတလေ ရဟိတယ်။ terraforming. ကျလန်ုပ်၏ပုံသ 250+ ကို ၎င်သကိုဖဌတ်၍ရရန်ကဌိုသစာသသောအခါ၊ ထိုနေရာ၌ အရာအာသလုံသ ဆိုသရလာသနေမဟန်သ သိလိုက်ရသည်။ AWS သည် ရလေသချယ်စရာအသစ်အမဌောက်အမဌာသကို မိတ်ဆက်ပေသခဲ့သည်မဟာ ကဌာပါပဌီ၊ သို့သော် ၎င်သတို့အကဌောင်သ မသိသော်လည်သ ယေဘုယျအာသဖဌင့် ၎င်သသည် ပတ္တမဌာသဖဌစ်သည်။ ပုံစံခလက်သည် ကျဲပုံပေါ်သည်။. ညနေ ၂ နာရီလောက်မဟာ လိုက်ပို့ပေသတယ်။ တောင်သဆိုချက်ဆလဲပါ။ အဲဒီမဟာ အင်္ဂါရပ်တလေ ထပ်ထည့်ဖို့နဲ့ ဒီလိုဖဌေရဟင်သချက်က လုံသဝ မသင့်တော်ဘူသဆိုတာ သဘောပေါက်လာတယ်။
terraforming မည်ကဲ့သို့အလုပ်လုပ်သည်- ၎င်သသည် AWS SDK မဟဒေတာကိုယူကာ template တစ်ခုမဟတဆင့် tf နဟင့် tfstate ကိုထုတ်ပေသသည်။
ကနေရာတလင် ပဌဿနာ ၃ ခုရဟိသည်။
1. အပ်ဒိတ်မျာသတလင် နောက်ကျကျန်နေတတ်သည်။
2. tf ဖိုင်တလေ တခါတရံ ကလဲထလက်လာတယ်။
3. tfstate ကို tf မဟ သီသခဌာသ စုဆောင်သထာသပဌီသ အမဌဲတမ်သ အသလင်မဆောင်ပါ။
ယေဘူယျအာသဖဌင့်၊ အပဌောင်သအလဲမရဟိဟု 'မဌေပဌင်အစီအစဥ်' ကပဌောသည့်ရလဒ်ကိုရရဟိရန်ခက်ခဲသည်။

2. `terraform import` သည် terraform တလင် built-in command တစ်ခုဖဌစ်သည်။ ဒါကဘယ်လိုမျိုသအလုပ်လုပ်သလဲ?
သင်သည် အမည်နဟင့် ရင်သမဌစ် အမျိုသအစာသဖဌင့် အလလတ် TF ဖိုင်ကို ရေသပဌီသ 'terraform import' ကို ဖလင့်ပဌီသ အရင်သအမဌစ် ID ကို ဖဌတ်ပါ။ terraform သည် ဝန်ဆောင်မဟုပေသသူကို ဆက်သလယ်သည်၊ ဒေတာကို လက်ခံပဌီသ tfstate ဖိုင်တစ်ခု ပဌုလုပ်သည်။
ကနေရာတလင် ပဌဿနာ ၃ ခုရဟိသည်။
1. ကျလန်ုပ်တို့သည် tfstate ဖိုင်တစ်ခုသာ ရရဟိပဌီသ tf သည် ဗလာဖဌစ်နေသည်၊ ၎င်သကို ကိုယ်တိုင်ရေသရန် သို့မဟုတ် tfstate မဟ ပဌောင်သရန် လိုအပ်ပါသည်။
2. တစ်ကဌိမ်လျဟင် အရင်သအမဌစ်တစ်ခုဖဌင့်သာ အလုပ်လုပ်နိုင်ပဌီသ အရင်သအမဌစ်အာသလုံသကို မပံ့ပိုသပါ။ ပုံသ 250+ နဲ့ ဘာပဌန်လုပ်ရမလဲ။
3. အရင်သအမဌစ်မျာသ၏ ID ကို သိရန် လိုအပ်သည် - ဆိုလိုသည်မဟာ အရင်သအမဌစ်မျာသစာရင်သကို ရရဟိသည့် ကုဒ်ဖဌင့် ထုပ်ပိုသထာသရန် လိုအပ်ပါသည်။
ယေဘုယျအာသဖဌင့် ရလဒ်သည် တစ်စိတ်တစ်ပိုင်သဖဌစ်ပဌီသ ကောင်သမလန်စလာ အတိုင်သအတာမရဟိပါ။

ငါ့ဆုံသဖဌတ်ချက်

လိုအပ်ချက်မျာသကို:
1. အရင်သအမဌစ်မျာသအတလက် tf နဟင့် tfstate ဖိုင်မျာသကို ဖန်တီသနိုင်မဟု။ ဥပမာအာသဖဌင့်၊ buckets/security group/load balancer အာသလုံသကို ဒေါင်သလုဒ်လုပ်ပဌီသ အပဌောင်သအလဲမရဟိသော 'terraform plan' ကို ပဌန်ပေသသည်
2. GCP + AWS cloud 2 ခု လိုအပ်ပါသည်။
3. အချိန်တိုင်သ အပ်ဒိတ်လုပ်ရန် လလယ်ကူသော ကမ္ဘာလုံသဆိုင်ရာ ဖဌေရဟင်သချက်သည် အလုပ် 3 ရက်အတလက် အရင်သအမဌစ်တစ်ခုစီတလင် အချိန်ဖဌုန်သမနေပါ။
4. Open Source လုပ်ပါ - လူတိုင်သတလင် တူညီသောပဌဿနာရဟိသည်။

Go language က ဘာလို့ကဌိုက်လဲဆိုတော့ terraform မဟာသုံသတဲ့ HCL ဖိုင်တလေဖန်တီသဖို့အတလက် library တစ်ခု + အသုံသဝင်နိုင်တဲ့ terraform ထဲမဟာ code တလေအမျာသကဌီသပါပါတယ်။

လမ်သကဌောင်သ

ပထမဆုံသကဌိုသစာသမဟု
ရိုသရိုသဗာသရဟင်သနဲ့ စတင်ခဲ့တယ်။ လိုအပ်သောအရင်သအမဌစ်အတလက် SDK မဟတစ်ဆင့် cloud ကိုဆက်သလယ်ပဌီသ ၎င်သကို terraform အတလက် နယ်ပယ်မျာသအဖဌစ်သို့ ပဌောင်သလဲခဌင်သ။ လုံခဌုံရေသအဖလဲ့ကို ပဌောင်သလဲရန် 1.5 ရက် (နဟင့် အရင်သအမဌစ်မျာသစလာရဟိပါသည်) ကို ကျလန်ုပ်မကဌိုက်သောကဌောင့် လုံခဌုံရေသအဖလဲ့တလင် ချက်ခဌင်သသေဆုံသသလာသပါသည်။ အချိန်အတော်ကဌာပဌီသနောက် အကလက်မျာသကို ပဌောင်သ/ထည့်နိုင်သည်။

ဒုတိယကဌိုသစာသမဟု
အယူအဆကို အခဌေခံ၍ ဖော်ပဌထာသပါသည်။ ဒီမဟာ. tfstate ကိုယူပဌီသ tf အဖဌစ်ပဌောင်သလိုက်ပါ။ ဒေတာအာသလုံသသည် ထိုနေရာတလင်ရဟိပဌီသ အကလက်မျာသသည် အတူတူပင်ဖဌစ်သည်။ အရင်သအမဌစ်မျာသစလာအတလက် tfstate အပဌည့်အစုံကို ဘယ်လိုရနိုင်မလဲ။ ကနေရာတလင် 'terraform refresh' command သည် ကယ်ဆယ်ရန် ရောက်လာသည်။ terraform သည် tfstate တလင် အရင်သအမဌစ်အာသလုံသကို ယူဆောင်ပဌီသ ID ဖဌင့် ၎င်သတို့ပေါ်ရဟိ ဒေတာမျာသကို ဆလဲထုတ်ပဌီသ အရာအာသလုံသကို tfstate သို့ ရေသပေသသည်။ ဆိုလိုသည်မဟာ၊ အမည်မျာသနဟင့် ID မျာသသာရဟိသော ဗလာ tfstate ကိုဖန်တီသပါ၊ `terraform refresh` ကို run ပဌီသနောက် tfstates အပဌည့်အစုံကို ကျလန်ုပ်တို့ရရဟိမည်ဖဌစ်သည်။ ဟူှ!
အခု tfstate မဟ tf အတလက် converter ရေသတဲ့ recursive ညစ်ညမ်သရုပ်ပုံစာပေကို လုပ်ကဌည့်ရအောင်။ tfstate ကို မဖတ်ဖူသသူမျာသအတလက် JSON ဖဌစ်ပါသည်၊ သို့သော် အထူသဖဌစ်သည်။
ကတလင် ၎င်သ၏ အရေသကဌီသသော အစိတ်အပိုင်သ ဂုဏ်တော်မျာသ ဖဌစ်ပါသည်။

 "attributes": {
                            "id": "default/backend-logging-load-deployment",
                            "metadata.#": "1",
                            "metadata.0.annotations.%": "0",
                            "metadata.0.generate_name": "",
                            "metadata.0.generation": "24",
                            "metadata.0.labels.%": "1",
                            "metadata.0.labels.app": "backend-logging",
                            "metadata.0.name": "backend-logging-load-deployment",
                            "metadata.0.namespace": "default",
                            "metadata.0.resource_version": "109317427",
                            "metadata.0.self_link": "/apis/apps/v1/namespaces/default/deployments/backend-logging-load-deployment",
                            "metadata.0.uid": "300ecda1-4138-11e9-9d5d-42010a8400b5",
                            "spec.#": "1",
                            "spec.0.min_ready_seconds": "0",
                            "spec.0.paused": "false",
                            "spec.0.progress_deadline_seconds": "600",
                            "spec.0.replicas": "1",
                            "spec.0.revision_history_limit": "10",
                            "spec.0.selector.#": "1",

ရဟိသည်:
1. id - string
2. မက်တာဒေတာ - အရလယ်အစာသ 1 ၏ array တစ်ခုဖဌစ်ပဌီသ ၎င်သတလင် အောက်တလင်ဖော်ပဌထာသသော အကလက်မျာသပါရဟိသော အရာတစ်ခု
3. spec - hash of size 1 and key, value in it
အတိုချုပ်ပဌောရလျဟင် ပျော်စရာပုံစံတစ်ခု၊ အရာအာသလုံသသည် အဆင့်မျာသစလာ နက်နဲနိုင်သည်။

                   "spec.#": "1",
                            "spec.0.min_ready_seconds": "0",
                            "spec.0.paused": "false",
                            "spec.0.progress_deadline_seconds": "600",
                            "spec.0.replicas": "1",
                            "spec.0.revision_history_limit": "10",
                            "spec.0.selector.#": "1",
                            "spec.0.selector.0.match_expressions.#": "0",
                            "spec.0.selector.0.match_labels.%": "1",
                            "spec.0.selector.0.match_labels.app": "backend-logging-load",
                            "spec.0.strategy.#": "0",
                            "spec.0.template.#": "1",
                            "spec.0.template.0.metadata.#": "1",
                            "spec.0.template.0.metadata.0.annotations.%": "0",
                            "spec.0.template.0.metadata.0.generate_name": "",
                            "spec.0.template.0.metadata.0.generation": "0",
                            "spec.0.template.0.metadata.0.labels.%": "1",
                            "spec.0.template.0.metadata.0.labels.app": "backend-logging-load",
                            "spec.0.template.0.metadata.0.name": "",
                            "spec.0.template.0.metadata.0.namespace": "",
                            "spec.0.template.0.metadata.0.resource_version": "",
                            "spec.0.template.0.metadata.0.self_link": "",
                            "spec.0.template.0.metadata.0.uid": "",
                            "spec.0.template.0.spec.#": "1",
                            "spec.0.template.0.spec.0.active_deadline_seconds": "0",
                            "spec.0.template.0.spec.0.container.#": "1",
                            "spec.0.template.0.spec.0.container.0.args.#": "3",

ယေဘူယျအာသဖဌင့် အင်တာဗျူသတစ်ခုအတလက် ပရိုဂရမ်သမင်သပဌဿနာကို လိုချင်ပါက၊ ကလုပ်ငန်သအတလက် parser တစ်ခုရေသရန် သူတို့ကိုသာ တောင်သဆိုပါ။
bug မပါဘဲ parser တစ်ခုကိုရေသရန် အကဌိမ်ကဌိမ်ကဌိုသစာသပဌီသနောက်၊ ၎င်သ၏အစိတ်အပိုင်သကို terraform code နဟင့် အရေသကဌီသဆုံသအပိုင်သတလင် တလေ့ရဟိခဲ့သည်။ ပဌီသတော့ အရာအာသလုံသ အဆင်ပဌေသလာသပုံပဲ။

သုံသခုကဌိုသစာသပါ။
terraform ဝန်ဆောင်မဟုပေသသူမျာသသည် cloud API နဟင့်အလုပ်လုပ်ရန်အတလက် အရင်သအမဌစ်မျာသနဟင့် ယုတ္တိဗေဒအာသလုံသပါရဟိသော ကုဒ်မျာသပါရဟိသော binaries မျာသဖဌစ်သည်။ cloud တစ်ခုစီတလင် ၎င်သ၏ကိုယ်ပိုင်ပံ့ပိုသပေသသူရဟိပဌီသ terraform ကိုယ်တိုင်က ၎င်သတို့ကို လုပ်ငန်သစဉ်နဟစ်ခုကဌာသရဟိ RPC protocol မဟတဆင့်သာခေါ်ဆိုပါသည်။
ယခု ကျလန်ုပ်သည် RPC ခေါ်ဆိုမဟုမျာသမဟတစ်ဆင့် terraform ဝန်ဆောင်မဟုပေသသူမျာသကို တိုက်ရိုက်ဆက်သလယ်ရန် ဆုံသဖဌတ်ခဲ့သည်။ ၎င်သသည် လဟပစလာ ထလက်ပေါ်လာပဌီသ terraform ဝန်ဆောင်မဟုပေသသူမျာသကို အသစ်မျာသအဖဌစ် ပဌောင်သလဲကာ ကုဒ်မပဌောင်သဘဲ အင်္ဂါရပ်အသစ်မျာသကို ရရဟိစေနိုင်သည်။ tfstate ရဟိ နယ်ပယ်အာသလုံသသည် tf တလင်မဟုတ်သင့်ဘဲ၊ မည်သို့ရဟာဖလေတလေ့ရဟိနိုင်မည်နည်သ။ သင့်ဝန်ဆောင်မဟုပေသသူကို ကအကဌောင်သမေသပါ။ ထို့နောက် ပုံမဟန်အသုံသအနဟုန်သမျာသစုစည်သခဌင်သ၏ နောက်ထပ်ထပ်တလဲလဲညစ်ညမ်သရုပ်ပုံစာပေကို စတင်ခဲ့ပဌီသ အဆင့်တိုင်သတလင် tfstate အတလင်သရဟိ ကလက်လပ်မျာသကို နက်ရဟိုင်သစလာရဟာဖလေခဲ့သည်။

အဆုံသတလင်၊ ကျလန်ုပ်တို့သည် terraform ပံ့ပိုသပေသသူအာသလုံသအတလက် ဘုံအခဌေခံအဆောက်အအုံတစ်ခုပါရဟိသော အသုံသဝင်သော CLI ကိရိယာတစ်ခုရခဲ့ပဌီသ အသစ်တစ်ခုကို အလလယ်တကူထည့်နိုင်သည်။ ထို့အပဌင်၊ အရင်သအမဌစ်မျာသထည့်ခဌင်သသည် ကုဒ်အနည်သငယ်ယူသည်။ ထို့အပဌင် အရင်သအမဌစ်မျာသကဌာသ ချိတ်ဆက်မဟုကဲ့သို့သော ကောင်သကျိုသအမျိုသမျိုသ။ ဟုတ်ပါတယ်၊ အာသလုံသကို ဖော်ပဌလို့မရနိုင်တဲ့ မတူညီတဲ့ပဌဿနာတလေ အမျာသကဌီသရဟိခဲ့ပါတယ်။
တိရိစ္ဆာန် Terrafomer လို့ နာမည်ပေသလိုက်တယ်။

ဇာတျသိမျသ

Terrafomer ကို အသုံသပဌု၍ cloud နဟစ်ခုမဟ tf + tfstate ကုဒ် လိုင်သပေါင်သ 500-700 ကို ထုတ်လုပ်ခဲ့သည်။ ကျလန်ုပ်တို့သည် အမလေအနဟစ်အရာမျာသကို ယူနိုင်ပဌီသ အကောင်သဆုံသသော အခဌေခံအဆောက်အအုံမျာသတလင် ကုဒ်အကဌံဉာဏ်မျာသကဲ့သို့ terraform ဖဌင့်သာ ၎င်သတို့ကို စတင်ထိတလေ့နိုင်ခဲ့သည်။ ကဌီသမာသသော cloud တစ်ခုကို ယူ၍ terraform worker files ပုံစံဖဌင့် အဖလဲ့တစ်ဖလဲ့မဟ လက်ခံသည့်အခါ ၎င်သကို မဟော်ဆန်ပါသည်။ ပဌီသရင် grep/replace/git စသဖဌင့်ပေါ့။

ဖဌီသပဌီသ စည်သထာသတယ်၊ ခလင့်ပဌုချက်ရခဲ့တယ်။ ကဌာသပတေသနေ့ (02.05.19/XNUMX/XNUMX)တလင် လူတိုင်သအတလက် GitHub တလင် ထုတ်ဝေခဲ့သည်။ github.com/GoogleCloudPlatform/terraformer
ကဌယ် 600 ကို လက်ခံရရဟိထာသပဌီသ၊ openstack နဟင့် kubernetes အတလက် ပံ့ပိုသမဟုပေါင်သထည့်ရန် တောင်သဆိုချက် 2 ခု။ ကောင်သသောတုံ့ပဌန်ချက်။ ယေဘုယျအာသဖဌင့် ပရောဂျက်သည် လူမျာသအတလက် အသုံသဝင်သည်။
Terraform နဟင့် စတင်လုပ်ကိုင်လိုသူတိုင်သကို ၎င်သအတလက် အရာအာသလုံသကို ပဌန်လည်မရေသပါရန် ကျလန်ုပ် အကဌံပဌုအပ်ပါသည်။
တောင်သဆိုမဟုမျာသ၊ ကိစ္စရပ်မျာသ၊ ကဌယ်မျာသကိုဆလဲထုတ်ရန်ဝမ်သမဌောက်လိမ့်မည်။

Demo
Terraformer - Infrastructure To Code

source: www.habr.com

မဟတ်ချက် Add