டெர்ராஃபார்மர் - உள்கட்டமைப்பு முதல் குறியீடு

டெர்ராஃபார்மர் - உள்கட்டமைப்பு முதல் குறியீடு
பழைய சிக்கலைத் தீர்க்க நான் எழுதிய புதிய CLI கருவியைப் பற்றி உங்களுக்குச் சொல்ல விரும்புகிறேன்.

பிரச்சனை

டெர்ராஃபார்ம் நீண்ட காலமாக டெவொப்ஸ்/கிளவுட்/ஐடி சமூகத்தில் ஒரு தரநிலையாக இருந்து வருகிறது. உள்கட்டமைப்பைக் குறியீடாகக் கையாள்வதற்கு விஷயம் மிகவும் வசதியானது மற்றும் பயனுள்ளது. டெர்ராஃபார்மில் பல மகிழ்வுகள் மற்றும் பல முட்கரண்டிகள், கூர்மையான கத்திகள் மற்றும் ரேக்குகள் உள்ளன.
டெர்ராஃபார்ம் மூலம் புதிய விஷயங்களை உருவாக்கி, அவற்றை நிர்வகிப்பது, மாற்றுவது அல்லது நீக்குவது மிகவும் வசதியானது. டெர்ராஃபார்ம் மூலம் உருவாக்கப்படாத கிளவுட்டில் மிகப்பெரிய உள்கட்டமைப்பு உள்ளவர்கள் என்ன செய்ய வேண்டும்? முழு மேகத்தையும் மீண்டும் எழுதுவது மற்றும் மீண்டும் உருவாக்குவது எப்படியோ விலை உயர்ந்தது மற்றும் பாதுகாப்பற்றது.
நான் 2 வேலைகளில் இந்தச் சிக்கலை எதிர்கொண்டேன், எளிமையான உதாரணம் எல்லாம் டெர்ராஃபார்ம் கோப்புகளாக Gitல் இருக்க வேண்டும் என்று நீங்கள் விரும்புகிறீர்கள், ஆனால் உங்களிடம் 250+ பக்கெட்டுகள் உள்ளன, மேலும் அவற்றை டெர்ராஃபார்மில் கையால் எழுதுவது மிகவும் அதிகம்.
உள்ளன பிரச்சினை 2014 முதல் டெரஃபோமில் இறக்குமதி செய்யப்படும் என்ற நம்பிக்கையுடன் 2016 இல் மூடப்பட்டது.

பொதுவாக, எல்லாமே படத்தில் உள்ளதைப் போல வலமிருந்து இடமாக மட்டுமே இருக்கும்

எச்சரிக்கைகள்: ஆசிரியர் தனது வாழ்நாளில் பாதி ரஷ்யாவில் வசிக்கவில்லை மற்றும் ரஷ்ய மொழியில் கொஞ்சம் எழுதுகிறார். எழுத்துப் பிழைகள் ஜாக்கிரதை.

தீர்வுகளை

1. AWSக்கு ஆயத்த மற்றும் பழைய தீர்வுகள் உள்ளன நிலப்பரப்பு. எனது 250+ வாளிகளை அதன் மூலம் பெற முயற்சித்தபோது, ​​அங்கு எல்லாம் மோசமாக இருப்பதை உணர்ந்தேன். AWS நீண்ட காலமாக பல புதிய விருப்பங்களை அறிமுகப்படுத்தி வருகிறது, ஆனால் டெராஃபார்மிங் அவற்றைப் பற்றி தெரியாது மற்றும் பொதுவாக இது ரூபி டெம்ப்ளேட் அரிதாகவே தெரிகிறது. மாலை 2 மணிக்கு பிறகு அனுப்பினேன் கோரிக்கையை இழுக்கவும் அங்கு கூடுதல் அம்சங்களைச் சேர்க்க, அத்தகைய தீர்வு பொருத்தமானது அல்ல என்பதை உணர்ந்தேன்.
டெர்ராஃபார்மிங் எவ்வாறு செயல்படுகிறது: இது AWS SDK இலிருந்து தரவை எடுத்து டெம்ப்ளேட் மூலம் tf மற்றும் tfstate ஐ உருவாக்குகிறது.
இங்கே 3 சிக்கல்கள் உள்ளன:
1. புதுப்பிப்புகளில் எப்போதும் பின்னடைவு இருக்கும்
2. tf கோப்புகள் சில நேரங்களில் உடைந்து வெளியே வரும்
3. tfstate tf இலிருந்து தனித்தனியாக சேகரிக்கப்படுகிறது மற்றும் எப்போதும் ஒன்றிணைவதில்லை
பொதுவாக, எந்த மாற்றமும் இல்லை என்று `டெர்ராஃபார்ம் திட்டம்` கூறும் முடிவைப் பெறுவது கடினம்

2. `டெர்ராஃபார்ம் இறக்குமதி` என்பது டெராஃபார்மில் உள்ளமைக்கப்பட்ட கட்டளை. இது எப்படி வேலை செய்கிறது?
நீங்கள் பெயர் மற்றும் ஆதார வகையுடன் ஒரு வெற்று TF கோப்பை எழுதி, பின்னர் `டெர்ராஃபார்ம் இறக்குமதி' ஐ இயக்கி, ஆதார ஐடியை அனுப்பவும். டெராஃபார்ம் வழங்குநரைத் தொடர்புகொண்டு, தரவைப் பெற்று tfstate கோப்பை உருவாக்குகிறது.
இங்கே 3 சிக்கல்கள் உள்ளன:
1. நாங்கள் ஒரு tfstate கோப்பை மட்டுமே பெறுகிறோம், tf காலியாக உள்ளது, நீங்கள் அதை கைமுறையாக எழுத வேண்டும் அல்லது tfstate இலிருந்து மாற்ற வேண்டும்
2. ஒரு நேரத்தில் ஒரு ஆதாரத்துடன் மட்டுமே வேலை செய்ய முடியும் மற்றும் எல்லா ஆதாரங்களையும் ஆதரிக்காது. 250+ வாளிகளுடன் நான் மீண்டும் என்ன செய்ய வேண்டும்?
3. ஆதாரங்களின் ஐடியை நீங்கள் தெரிந்து கொள்ள வேண்டும் - அதாவது, ஆதாரங்களின் பட்டியலைப் பெறும் குறியீட்டில் அதை மடிக்க வேண்டும்.
பொதுவாக, முடிவு பகுதி மற்றும் நன்றாக அளவிட முடியாது

என் முடிவு

தேவைகள்:
1. ஆதாரங்களுக்கான tf மற்றும் tfstate கோப்புகளை உருவாக்கும் திறன். எடுத்துக்காட்டாக, அனைத்து வாளிகள்/பாதுகாப்பு குழு/லோட் பேலன்சரை பதிவிறக்கம் செய்து, எந்த மாற்றமும் இல்லை என்று `டெர்ராஃபார்ம் திட்டம்' திரும்பியது.
2. உங்களுக்கு 2 GCP + AWS மேகங்கள் தேவை
3. ஒவ்வொரு முறையும் புதுப்பிக்க எளிதான உலகளாவிய தீர்வு மற்றும் 3 நாட்கள் வேலைக்காக ஒவ்வொரு வளத்திலும் நேரத்தை வீணாக்காது
4. இதை ஓப்பன் சோர்ஸ் ஆக்குங்கள் - அனைவருக்கும் ஒரே பிரச்சனை

கோ மொழி ஏன் எனக்கு மிகவும் பிடிக்கும், மேலும் டெராஃபார்மில் பயன்படுத்தப்படும் HCL கோப்புகளை உருவாக்குவதற்கான நூலகம் உள்ளது + டெராஃபார்மில் நிறைய குறியீடுகள் பயனுள்ளதாக இருக்கும்

பாதை

முதலில் முயற்சிக்கவும்
நான் ஒரு எளிய பதிப்பில் தொடங்கினேன். தேவையான ஆதாரத்திற்காக SDK வழியாக கிளவுட்டைத் தொடர்புகொண்டு அதை டெர்ராஃபார்மிற்கான புலங்களாக மாற்றவும். பாதுகாப்புக் குழுவை மட்டும் மாற்றுவதற்கான 1.5 நாட்கள் எனக்குப் பிடிக்காததால் (மேலும் நிறைய ஆதாரங்கள் உள்ளன) இந்த முயற்சி உடனடியாக பாதுகாப்புக் குழுவில் இறந்துவிட்டது. நீண்ட காலத்திற்கு பின்னர் புலங்களை மாற்றலாம்/சேர்க்கலாம்

இரண்டாவது முயற்சி
விவரிக்கப்பட்ட யோசனையின் அடிப்படையில் இங்கே. எடுத்து tfstate ஐ tf ஆக மாற்றவும். எல்லா தரவுகளும் உள்ளன மற்றும் புலங்கள் ஒரே மாதிரியானவை. பல ஆதாரங்களுக்கு முழு tfstate பெறுவது எப்படி ?? இங்குதான் `டெர்ராஃபார்ம் ரெஃப்ரெஷ்` கட்டளை உதவிக்கு வந்தது. terraform tfstate இல் உள்ள அனைத்து ஆதாரங்களையும் எடுத்து, ID மூலம், அவற்றில் உள்ள தரவை வெளியே இழுத்து எல்லாவற்றையும் tfstate க்கு எழுதுகிறது. அதாவது, பெயர்கள் மற்றும் ஐடிகளை மட்டும் கொண்ட ஒரு வெற்று tfstate ஐ உருவாக்கி, `terraform refresh` ஐ இயக்கவும், பிறகு முழு tfstates கிடைக்கும். ஹூரே!
இப்போது tfstate க்கு tf க்கு மாற்றி எழுதும் சுழல்நிலை ஆபாசத்தை செய்வோம். 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. ஐடி - சரம்
2. மெட்டாடேட்டா - அளவு 1 வரிசை மற்றும் அதில் புலங்களைக் கொண்ட ஒரு பொருள் கீழே விவரிக்கப்பட்டுள்ளது
3. விவரக்குறிப்பு - அளவு 1 மற்றும் விசையின் ஹாஷ், அதில் உள்ள மதிப்பு
சுருக்கமாக, ஒரு வேடிக்கையான வடிவம், எல்லாமே பல நிலைகளில் ஆழமாக இருக்கலாம்

                   "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",

பொதுவாக, யாரேனும் ஒரு நேர்காணலுக்கான நிரலாக்கப் பிரச்சனையை விரும்பினால், இந்தப் பணிக்காக ஒரு பாகுபடுத்தி எழுதச் சொல்லுங்கள் :)
பிழைகள் இல்லாமல் ஒரு பாகுபடுத்தி எழுத பல முயற்சிகளுக்குப் பிறகு, டெராஃபார்ம் குறியீட்டில் அதன் ஒரு பகுதியையும், மிக முக்கியமான பகுதியையும் கண்டேன். மற்றும் எல்லாம் நன்றாக வேலை செய்ய தோன்றியது

முயற்சி மூன்று
டெர்ராஃபார்ம் வழங்குநர்கள் கிளவுட் API உடன் பணிபுரிவதற்கான அனைத்து ஆதாரங்கள் மற்றும் தர்க்கத்துடன் குறியீட்டைக் கொண்ட பைனரிகள். ஒவ்வொரு மேகத்திற்கும் அதன் சொந்த வழங்குநர் உள்ளது மற்றும் டெர்ராஃபார்ம் இரண்டு செயல்முறைகளுக்கு இடையில் அதன் RPC நெறிமுறை மூலம் மட்டுமே அவர்களை அழைக்கிறது.
இப்போது டெராஃபார்ம் வழங்குநர்களை RPC அழைப்புகள் மூலம் நேரடியாகத் தொடர்புகொள்ள முடிவு செய்தேன். இது அழகாக மாறியது மற்றும் டெராஃபார்ம் வழங்குநர்களை புதியதாக மாற்றவும், குறியீட்டை மாற்றாமல் புதிய அம்சங்களைப் பெறவும் முடிந்தது. tfstate இல் உள்ள அனைத்து புலங்களும் tf இல் இருக்கக்கூடாது என்பதும் மாறிவிடும், ஆனால் நீங்கள் எப்படி கண்டுபிடிப்பது? இதைப் பற்றி உங்கள் வழங்குநரிடம் கேளுங்கள். பின்னர் வழக்கமான வெளிப்பாடுகளை ஒருங்கிணைக்கும் மற்றொரு சுழல்நிலை ஆபாசப்படம் தொடங்கியது, ஆழத்தில் அனைத்து மட்டங்களிலும் tfstate க்குள் புலங்களைத் தேடுகிறது.

முடிவில், அனைத்து டெராஃபார்ம் வழங்குநர்களுக்கும் பொதுவான உள்கட்டமைப்பைக் கொண்ட பயனுள்ள CLI கருவியைப் பெற்றுள்ளோம், மேலும் நீங்கள் எளிதாக புதிய ஒன்றைச் சேர்க்கலாம். மேலும், ஆதாரங்களைச் சேர்ப்பதற்கு சிறிய குறியீடு தேவைப்படுகிறது. மேலும் வளங்களுக்கிடையேயான இணைப்புகள் போன்ற அனைத்து வகையான இன்னபிற பொருட்களும். நிச்சயமாக, விவரிக்க முடியாத பல சிக்கல்கள் இருந்தன.
அந்த விலங்குக்கு டெர்ராஃபோமர் என்று பெயரிட்டேன்.

இறுதி

டெர்ராஃபோமரைப் பயன்படுத்தி, இரண்டு மேகங்களிலிருந்து 500-700 ஆயிரம் வரிகள் tf + tfstate குறியீட்டை உருவாக்கினோம். குறியீட்டு யோசனைகளாக சிறந்த உள்கட்டமைப்பைப் போலவே, மரபுவழி விஷயங்களை எடுத்துக்கொண்டு டெர்ராஃபார்ம் மூலம் மட்டுமே அவற்றைத் தொடத் தொடங்கினோம். நீங்கள் ஒரு பெரிய மேகத்தை எடுத்து ஒரு குழு மூலம் டெர்ராஃபார்ம் பணியாளர் கோப்புகள் வடிவில் பெறும்போது அது வெறும் மந்திரம். பின்னர் grep/replace/git மற்றும் பல.

நான் அதை சீப்பு செய்து ஒழுங்காக வைத்தேன், அனுமதி பெற்றேன். வியாழக்கிழமை (02.05.19/XNUMX/XNUMX) அனைவருக்கும் GitHub இல் வெளியிடப்பட்டது. github.com/GoogleCloudPlatform/terraformer
ஏற்கனவே 600 நட்சத்திரங்களைப் பெற்றுள்ளது, ஓபன்ஸ்டாக் மற்றும் குபெர்னெட்டிற்கான ஆதரவைச் சேர்ப்பதற்கான 2 இழுவை கோரிக்கைகள். நல்ல கருத்து. பொதுவாக, இந்த திட்டம் மக்களுக்கு பயனுள்ளதாக இருக்கும்
டெர்ராஃபார்முடன் பணிபுரியத் தொடங்க விரும்பும் அனைவருக்கும் நான் அறிவுறுத்துகிறேன், இதற்காக எல்லாவற்றையும் மீண்டும் எழுத வேண்டாம்.
கோரிக்கைகள், சிக்கல்கள், நட்சத்திரங்களை இழுப்பதில் நான் மகிழ்ச்சியடைவேன்.

டெமோ
டெர்ராஃபார்மர் - உள்கட்டமைப்பு முதல் குறியீடு

ஆதாரம்: www.habr.com

கருத்தைச் சேர்