పాత సమస్యను పరిష్కరించడానికి నేను వ్రాసిన కొత్త CLI సాధనం గురించి నేను మీకు చెప్పాలనుకుంటున్నాను.
సమస్య
డెవొప్స్/క్లౌడ్/ఐటి కమ్యూనిటీలో టెర్రాఫార్మ్ చాలా కాలంగా ప్రమాణంగా ఉంది. అవస్థాపనతో కోడ్గా వ్యవహరించడానికి విషయం చాలా సౌకర్యవంతంగా మరియు ఉపయోగకరంగా ఉంటుంది. టెర్రాఫార్మ్లో అనేక డిలైట్స్ అలాగే అనేక ఫోర్కులు, పదునైన కత్తులు మరియు రేక్లు ఉన్నాయి.
టెర్రాఫార్మ్తో కొత్త విషయాలను సృష్టించడం మరియు వాటిని నిర్వహించడం, మార్చడం లేదా తొలగించడం చాలా సౌకర్యవంతంగా ఉంటుంది. క్లౌడ్లో భారీ ఇన్ఫ్రాస్ట్రక్చర్ ఉండి, టెర్రాఫార్మ్ ద్వారా సృష్టించని వారు ఏం చేయాలి? మొత్తం క్లౌడ్ను తిరిగి వ్రాయడం మరియు మళ్లీ సృష్టించడం అనేది ఒకవిధంగా ఖరీదైనది మరియు సురక్షితం కాదు.
నేను 2 ఉద్యోగాలలో ఈ సమస్యను ఎదుర్కొన్నాను, మీరు టెర్రాఫార్మ్ ఫైల్ల రూపంలో ప్రతిదీ Gitలో ఉండాలని మీరు కోరుకున్నప్పుడు సరళమైన ఉదాహరణ, కానీ మీ వద్ద 250+ బకెట్లు ఉన్నాయి మరియు వాటిని చేతితో టెర్రాఫార్మ్లో వ్రాయడం చాలా ఎక్కువ.
ఉన్నాయి
సాధారణంగా, ప్రతిదీ కుడి నుండి ఎడమకు మాత్రమే చిత్రంలో ఉంటుంది
హెచ్చరికలు: రచయిత తన జీవితంలో సగం రష్యాలో నివసించడు మరియు రష్యన్ భాషలో చాలా తక్కువగా వ్రాస్తాడు. అక్షర దోషాల పట్ల జాగ్రత్త వహించండి.
సొల్యూషన్స్
1. AWS కోసం రెడీమేడ్ మరియు పాత పరిష్కారాలు ఉన్నాయి
టెర్రాఫార్మింగ్ ఎలా పని చేస్తుంది: ఇది AWS SDK నుండి డేటాను తీసుకుంటుంది మరియు టెంప్లేట్ ద్వారా tf మరియు tfstateని ఉత్పత్తి చేస్తుంది.
ఇక్కడ 3 సమస్యలు ఉన్నాయి:
1. అప్డేట్లలో ఎల్లప్పుడూ లాగ్ ఉంటుంది
2. tf ఫైల్స్ కొన్నిసార్లు విరిగిపోతాయి
3. tfstate tf నుండి విడిగా సేకరించబడుతుంది మరియు ఎల్లప్పుడూ కలుస్తుంది
సాధారణంగా, ఎలాంటి మార్పులు లేవని `టెర్రాఫార్మ్ ప్లాన్` చెప్పే ఫలితాన్ని పొందడం కష్టం
2. `టెర్రాఫార్మ్ దిగుమతి` అనేది టెర్రాఫార్మ్లో అంతర్నిర్మిత కమాండ్. ఇది ఎలా పని చేస్తుంది?
మీరు పేరు మరియు వనరు రకంతో ఖాళీ TF ఫైల్ను వ్రాసి, ఆపై `టెర్రాఫాం దిగుమతి`ని అమలు చేసి, వనరు IDని పాస్ చేయండి. terraform ప్రొవైడర్ను సంప్రదిస్తుంది, డేటాను స్వీకరిస్తుంది మరియు tfstate ఫైల్ను చేస్తుంది.
ఇక్కడ 3 సమస్యలు ఉన్నాయి:
1. మేము tfstate ఫైల్ను మాత్రమే పొందుతాము మరియు tf ఖాళీగా ఉంది, మీరు దానిని మాన్యువల్గా వ్రాయాలి లేదా tfstate నుండి మార్చాలి
2. ఒక సమయంలో ఒక వనరుతో మాత్రమే పని చేయగలదు మరియు అన్ని వనరులకు మద్దతు ఇవ్వదు. మరియు 250+ బకెట్లతో నేను మళ్లీ ఏమి చేయాలి?
3. మీరు వనరుల IDని తెలుసుకోవాలి - అంటే, మీరు వనరుల జాబితాను పొందే కోడ్లో దాన్ని చుట్టాలి
సాధారణంగా, ఫలితం పాక్షికంగా ఉంటుంది మరియు బాగా స్కేల్ చేయదు
నా నిర్ణయం
అవసరాలు:
1. వనరుల కోసం tf మరియు tfstate ఫైల్లను సృష్టించగల సామర్థ్యం. ఉదాహరణకు, అన్ని బకెట్లు/సెక్యూరిటీ గ్రూప్/లోడ్ బ్యాలెన్సర్ని డౌన్లోడ్ చేయండి మరియు మార్పులు లేవని ఆ `టెర్రాఫార్మ్ ప్లాన్` తిరిగి వచ్చింది
2. మీకు 2 GCP + AWS క్లౌడ్లు అవసరం
3. ప్రతిసారీ నవీకరించడం సులభం మరియు 3 రోజుల పని కోసం ప్రతి వనరుపై సమయాన్ని వృథా చేయని గ్లోబల్ సొల్యూషన్
4. దీన్ని ఓపెన్ సోర్స్ చేయండి - అందరికీ ఒకే సమస్య ఉంటుంది
గో భాష అంటే నాకు చాలా ఇష్టం, మరియు టెరాఫార్మ్లో ఉపయోగించే హెచ్సిఎల్ ఫైల్లను రూపొందించడానికి ఇది లైబ్రరీని కలిగి ఉంది + టెర్రాఫార్మ్లో చాలా కోడ్ ఉపయోగపడుతుంది
మార్గం
మొదటి ప్రయత్నం
నేను సాధారణ సంస్కరణతో ప్రారంభించాను. అవసరమైన వనరు కోసం SDK ద్వారా క్లౌడ్ని సంప్రదించడం మరియు దానిని టెర్రాఫార్మ్ కోసం ఫీల్డ్లుగా మార్చడం. భద్రతా సమూహాన్ని మాత్రమే మార్చడానికి 1.5 రోజులు నాకు ఇష్టం లేనందున (మరియు చాలా వనరులు ఉన్నాయి) ఈ ప్రయత్నం వెంటనే భద్రతా సమూహంలో మరణించింది. చాలా కాలం పాటు ఆపై ఫీల్డ్లను మార్చవచ్చు/జోడించవచ్చు
రెండవ ప్రయత్నం
వివరించిన ఆలోచన ఆధారంగా
ఇప్పుడు 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. id - స్ట్రింగ్
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 సాధనాన్ని పొందాము మరియు మీరు సులభంగా కొత్తదాన్ని జోడించవచ్చు. అలాగే, వనరులను జోడించడానికి తక్కువ కోడ్ పడుతుంది. అంతేకాకుండా వనరుల మధ్య కనెక్షన్లు వంటి అన్ని రకాల గూడీస్. వాస్తవానికి, అన్నింటినీ వివరించలేని అనేక విభిన్న సమస్యలు ఉన్నాయి.
నేను జంతువుకు టెర్రాఫోమర్ అని పేరు పెట్టాను.
ముగింపు
Terrafomerని ఉపయోగించి, మేము రెండు మేఘాల నుండి 500-700 వేల tf + tfstate కోడ్ని రూపొందించాము. మేము లెగసీ విషయాలను తీసుకోగలిగాము మరియు టెర్రాఫారమ్ ద్వారా మాత్రమే వాటిని తాకడం ప్రారంభించాము, ఉత్తమమైన మౌలిక సదుపాయాలలో కోడ్ ఆలోచనలు వలె. మీరు భారీ క్లౌడ్ని తీసుకుని, టెర్రాఫార్మ్ వర్కర్ ఫైల్ల రూపంలో బృందం ద్వారా స్వీకరించినప్పుడు ఇది కేవలం మాయాజాలం. ఆపై grep/replace/git మరియు మొదలైనవి.
నేను దానిని దువ్వెన మరియు క్రమంలో ఉంచాను, అనుమతి పొందాను. గురువారం (02.05.19/XNUMX/XNUMX) అందరి కోసం GitHubలో విడుదల చేయబడింది.
ఓపెన్స్టాక్ మరియు కుబెర్నెట్లకు మద్దతుని జోడించడం కోసం ఇప్పటికే 600 స్టార్లు, 2 పుల్ అభ్యర్థనలు వచ్చాయి. మంచి అభిప్రాయం. సాధారణంగా, ప్రాజెక్ట్ ప్రజలకు ఉపయోగకరంగా ఉంటుంది
టెర్రాఫార్మ్తో పనిచేయడం ప్రారంభించాలనుకునే ప్రతి ఒక్కరికీ నేను సలహా ఇస్తున్నాను మరియు దీని కోసం ప్రతిదీ తిరిగి వ్రాయవద్దు.
నేను అభ్యర్థనలు, సమస్యలు, నక్షత్రాలను లాగడానికి సంతోషిస్తాను.
డెమో
మూలం: www.habr.com