Terraformer - Infrastructure To Code

Terraformer - Infrastructure To Code
Mig langar að segja þér frá nýja CLI tólinu sem ég skrifaði til að leysa gamalt vandamál.

vandamálið

Terraform hefur lengi verið staðall í Devops/Cloud/IT samfélaginu. Hluturinn er mjög þægilegur og gagnlegur til að takast á við innviði sem kóða. Það er margt unað í Terraform sem og margir gafflar, beittir hnífar og hrífur.
Með Terraform er mjög þægilegt að búa til nýja hluti og síðan stjórna, breyta eða eyða þeim. Hvað ættu þeir sem eru með risastóra innviði í skýinu og ekki búnir til í gegnum Terraform að gera? Að endurskrifa og endurskapa allt skýið er einhvern veginn dýrt og óöruggt.
Ég lenti í þessu vandamáli við 2 störf, einfaldasta dæmið er þegar þú vilt að allt sé í Git í formi terraform skráa, en þú ert með 250+ fötur og það er mikið að skrifa þær í terraform í höndunum.
Það er mál síðan 2014 í terrafom sem var lokað 2016 með von um að það verði innflutningur.

Almennt séð er allt eins og á myndinni aðeins frá hægri til vinstri

Viðvaranir: Höfundur býr ekki hálfa ævi sína í Rússlandi og skrifar lítið á rússnesku. Varist stafsetningarvillur.

Lausnir

1. Það eru til tilbúnar og gamlar lausnir fyrir AWS terraforming. Þegar ég reyndi að koma 250+ fötunum mínum í gegnum það, áttaði ég mig á því að þar var allt slæmt. AWS hefur lengi verið að kynna fullt af nýjum valkostum, en terraforming veit ekki um þá og almennt er það rúbín sniðmátið lítur rýr út. Eftir 2 um kvöldið sendi ég Dragðu beiðni að bæta við fleiri möguleikum þar og áttaði sig á því að slík lausn hentar alls ekki.
Hvernig terraforming virkar: það tekur gögn frá AWS SDK og býr til tf og tfstate í gegnum sniðmát.
Það eru 3 vandamál hér:
1. Það verður alltaf töf í uppfærslum
2. TF skrár koma stundum út brotnar
3. tfástand er safnað sérstaklega frá tf og rennur ekki alltaf saman
Almennt séð er erfitt að fá niðurstöðu þar sem `terraform plan` segir að engar breytingar séu

2. `terraform import` er innbyggð skipun í terraform. Hvernig virkar það?
Þú skrifar tóma TF skrá með nafni og tegund auðlindar, keyrir síðan `terraform import` og sendir auðkenni auðlindar. terraform hefur samband við veituna, tekur við gögnunum og gerir tfstate skrá.
Það eru 3 vandamál hér:
1. Við fáum aðeins tfstate skrá, og tf er tómt, þú þarft að skrifa hana handvirkt eða umbreyta henni úr tfstate
2. Getur aðeins unnið með eina auðlind í einu og styður ekki öll auðlindir. Og hvað ætti ég að gera aftur með 250+ fötu?
3. Þú þarft að vita auðkenni auðlindanna - það er, þú þarft að pakka því inn í kóða sem fær lista yfir auðlindir
Almennt séð er útkoman að hluta og mælist ekki vel

Ákvörðun mín

Kröfur:
1. Geta til að búa til tf og tfstate skrár fyrir auðlindir. Til dæmis, hlaðið niður öllum fötunum/öryggishópnum/hleðslujafnara og að `terraform plan` skilaði að það eru engar breytingar
2. Þú þarft 2 GCP + AWS ský
3. Alþjóðleg lausn sem auðvelt er að uppfæra í hvert skipti og eyðir ekki tíma í hverja auðlind í 3 daga vinnu
4. Gerðu það Open Source - allir hafa sama vandamál

Go tungumálið er ástæða þess að ég elska það og það hefur bókasafn til að búa til HCL skrár sem eru notaðar í terraform + mikið af kóða í terraform sem getur verið gagnlegt

Path

Fyrsta tilraun
Ég byrjaði með einfalda útgáfu. Að hafa samband við skýið í gegnum SDK fyrir nauðsynlega auðlind og umbreyta því í reiti fyrir terraform. Tilraunin dó strax á öryggishópnum vegna þess að mér líkaði ekki 1.5 dagarnir til að breyta aðeins öryggishópnum (og það er mikið af úrræðum). Í langan tíma og þá er hægt að breyta/bæta við reiti

Önnur tilraun
Byggt á hugmyndinni sem lýst er hér. Taktu bara og breyttu tfstate í tf. Öll gögn eru til staðar og reitirnir eru eins. Hvernig á að fá fullt tfstate fyrir margar auðlindir?? Þetta er þar sem `terraform refresh` skipunin kom til bjargar. terraform tekur allar auðlindir í tfstate og, með auðkenni, dregur út gögn um þær og skrifar allt til tfstate. Það er að segja, búa til tómt tfstate með aðeins nöfnum og auðkenni, keyra `terraform refresh` og þá fáum við fullt tfstates. Húrra!
Nú skulum við gera endurtekið klám að skrifa breytir fyrir tfstate til tf. Fyrir þá sem hafa aldrei lesið tfstate er það JSON, en sérstakt.
Hér eru mikilvægir hlutaeiginleikar þess

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

Það er:
1. auðkenni - strengur
2. lýsigögn - fylki af stærð 1 og í henni hlutur með sviðum sem lýst er hér að neðan
3. sérstakur - kjötkássa af stærð 1 og lykill, gildi í því
Í stuttu máli, skemmtilegt snið, allt getur verið nokkur stig djúpt

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

Almennt séð, ef einhver vill forritunarvandamál fyrir viðtal skaltu bara biðja hann um að skrifa þáttara fyrir þetta verkefni :)
Eftir margar tilraunir til að skrifa parser án galla fann ég hluta af honum í terraform kóðanum og mikilvægasta hlutann. Og allt virtist ganga vel

Tilraun þrjú
terraform veitendur eru tvöfaldir sem innihalda kóða með öllum tilföngum og rökfræði til að vinna með ský API. Hvert ský hefur sína eigin þjónustuveitu og terraform sjálft kallar þá aðeins í gegnum RPC samskiptareglur á milli tveggja ferla.
Nú ákvað ég að hafa beint samband við terraform veitendur í gegnum RPC símtöl. Það kom fallega út og gerði það mögulegt að breyta terraform veitum í nýrri og fá nýja eiginleika án þess að breyta kóðanum. Það kemur líka í ljós að ekki ættu allir reiti í tfstate að vera í tf, en hvernig geturðu komist að því? Spurðu bara þjónustuveituna þína um þetta. Þá hófst önnur endurhverf klámmynd af því að setja saman reglubundnar tjáningar, þar sem leitað var að sviðum inni í tfstate á öllum stigum í dýpt.

Að lokum fengum við gagnlegt CLI tól sem hefur sameiginlegan innviði fyrir alla terraform veitendur og þú getur auðveldlega bætt við nýju. Að bæta við auðlindum tekur líka lítinn kóða. Auk allskonar góðgæti eins og tengingar á milli auðlinda. Auðvitað voru mörg mismunandi vandamál sem ekki er hægt að lýsa öllum.
Ég nefndi dýrið Terrafomer.

Final

Með því að nota Terrafomer mynduðum við 500-700 þúsund línur af tf + tfstate kóða úr tveimur skýjum. Við gátum tekið eldri hluti og byrjað að snerta þá aðeins í gegnum terraform, eins og í bestu innviðum sem kóðahugmyndir. Það er bara galdur þegar þú tekur risastórt ský og færð það í gegnum teymi í formi terraform starfsmannaskráa. Og svo grep/replace/git og svo framvegis.

Ég greiddi það út og setti það í röð, fékk leyfi. Gefið út á GitHub fyrir alla á fimmtudaginn (02.05.19/XNUMX/XNUMX). github.com/GoogleCloudPlatform/terraformer
Þegar fengið 600 stjörnur, 2 dráttarbeiðnir um að bæta við stuðningi fyrir openstack og kubernetes. Góð viðbrögð. Almennt séð er verkefnið gagnlegt fyrir fólk
Ég ráðlegg öllum sem vilja byrja að vinna með Terraform og endurskrifa ekki allt fyrir þetta.
Ég mun vera feginn að draga beiðnir, málefni, stjörnur.

Демо
Terraformer - Infrastructure To Code

Heimild: www.habr.com

Bæta við athugasemd