Terraformer - Infrastruktur Pikeun Code

Terraformer - Infrastruktur Pikeun Code
Abdi hoyong ngabejaan Anjeun tentang alat CLI anyar nu kuring wrote pikeun ngajawab hiji masalah heubeul.

masalah

Terraform parantos lami janten standar dina komunitas Devops/Cloud/IT. Hal éta pisan merenah tur mangpaat pikeun kaayaan infrastruktur salaku kode. Aya seueur nikmat di Terraform ogé seueur garpu, péso seukeut sareng garu.
Kalayan Terraform pisan merenah pikeun nyieun hal anyar lajeng ngatur, ngarobah atawa ngahapus aranjeunna. Naon anu kudu dilakukeun ku jalma anu ngagaduhan infrastruktur anu ageung dina méga sareng henteu diciptakeun ngalangkungan Terraform? Nulis ulang jeung nyieun deui sakabéh awan téh kumaha bae age mahal jeung teu aman.
Kuring encountered masalah ieu dina 2 jobs, conto pangbasajanna nyaeta nalika anjeun hoyong sagalana janten di Git dina bentuk file terraform, tapi anjeun boga 250+ ember na éta loba nulis aranjeunna dina terraform ku leungeun.
aya masalah saprak 2014 di terrafom nu ditutup dina 2016 kalawan harepan nu bakal aya impor.

Sacara umum, sadayana sapertos dina gambar ngan ti katuhu ka kenca

Peringatan: Panulis henteu cicing di Rusia salami satengah hirupna sareng nyerat sakedik dina basa Rusia. Waspada kasalahan éjahan.

Solusi na

1. Aya solusi siap-dijieun tur heubeul pikeun AWS terraforming. Nalika kuring diusahakeun meunang kuring 250+ ember ngaliwatan eta, Kuring sadar yen sagalana éta goréng aya. AWS parantos lami ngenalkeun seueur pilihan énggal, tapi terraforming henteu terang ngeunaan éta sareng sacara umum éta ruby template Sigana sparse. Saatos jam 2 sonten abdi dikirim Paménta tarik pikeun nambihan langkung seueur fitur di dinya sareng sadar yén solusi sapertos kitu henteu cocog pisan.
Kumaha terraforming jalan: butuh data ti AWS SDK sarta ngahasilkeun tf na tfstate ngaliwatan citakan.
Aya 3 masalah di dieu:
1. Aya bakal salawasna jadi lag di apdet
2. file tf kadang kaluar rusak
3. tfstate dikumpulkeun misah ti tf sarta henteu salawasna konvergen
Sacara umum, hese pikeun meunangkeun hasil nu `rencana terraform` nyebutkeun yen aya euweuh parobahan

2. `terraform import` nyaéta paréntah anu diwangun dina terraform. Kumaha jalanna?
Anjeun nyerat file TF kosong kalayan nami sareng jinis sumberdaya, teras ngajalankeun `terraform import` sareng lulus ID sumberdaya. terraform ngahubungi panyadia, nampi data sareng ngadamel file tfstate.
Aya 3 masalah di dieu:
1. Kami ngan ukur kéngingkeun file tfstate, sareng tf kosong, anjeun kedah nyerat sacara manual atanapi ngarobih tina tfstate
2. Ngan ukur tiasa dianggo sareng hiji sumber dina hiji waktos sareng henteu ngadukung sadaya sumber. Sareng naon anu kuring kedah laksanakeun deui sareng 250+ ember?
3. Anjeun kudu nyaho ID sumberdaya - nyaeta, Anjeun kudu mungkus eta dina kode nu meunang daptar sumberdaya
Sacara umum, hasilna parsial sareng henteu skalana saé

kaputusan kuring

Syarat:
1. Kamampuhan pikeun nyieun tf na tfstate file pikeun sumberdaya. Contona, unduh sadaya ember/grup kaamanan/load balancer sarta yén `rencana terraform` balik yén teu aya parobahan.
2. Anjeun peryogi 2 GCP + AWS awan
3. Solusi global anu gampang pikeun ngapdet unggal waktos sareng henteu miceunan waktos dina unggal sumber pikeun 3 dinten damel
4. Jieun Open Source - dulur boga masalah anu sarua

Basa Go naha kuring resep éta, sareng éta ngagaduhan perpustakaan pikeun nyiptakeun file HCL anu dianggo dina terraform + seueur kode dina terraform anu tiasa mangpaat.

Jalanna

usaha munggaran
Kuring dimimitian ku versi basajan. Ngahubungan awan ngaliwatan SDK pikeun sumberdaya diperlukeun tur ngarobahna kana widang pikeun terraform. usaha maot langsung dina grup kaamanan sabab kuring teu resep 1.5 poé ngarobah ngan grup kaamanan (jeung aya loba sumberdaya). Pikeun lila lajeng widang bisa dirobah / ditambahkeun

usaha kadua
Dumasar kana gagasan anu ditétélakeun di dieu. Ngan nyandak sareng ngarobih tfstate ka tf. Sadaya data aya sareng sawahna sami. Kumaha carana kéngingkeun tfstate pinuh pikeun seueur sumber?? Ieu dimana paréntah `terraform refresh` sumping ka nyalametkeun teh. terraform nyandak sadaya sumber di tfstate sareng, ku ID, narik data dina aranjeunna sareng nyerat sadayana kana tfstate. Nyaéta, jieun tfstate kosong kalayan ngan ukur nami sareng ID, jalankeun `terraform refresh` teras urang nampi tfstates pinuh. Horeeee!
Ayeuna hayu urang ngalakukeun pornografi rekursif nulis konverter pikeun tfstate ka tf. Pikeun anu henteu pernah maca tfstate, éta JSON, tapi khusus.
Ieu mangrupikeun atribut bagian anu penting

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

Aya:
1. id - string
2. metadata - hiji Asép Sunandar Sunarya ukuran 1 sarta di jerona hiji obyék kalawan widang nu dijelaskeun di handap
3. Spesifikasina - Hash ukuran 1 jeung konci, nilai di jerona
Pondokna, hiji format fun, sagalana tiasa sababaraha tingkat jero

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

Sacara umum, upami aya anu hoyong masalah pemrograman pikeun wawancara, naroskeun aranjeunna nyerat parser pikeun tugas ieu :)
Saatos seueur usaha pikeun nyerat parser tanpa bug, kuring mendakan bagian éta dina kode terraform, sareng bagian anu paling penting. Jeung sagalana seemed dianggo rupa

Usaha tilu
Panyadia terraform mangrupikeun binér anu ngandung kode sareng sadaya sumber daya sareng logika pikeun damel sareng API awan. Unggal awan boga panyadia sorangan sarta terraform sorangan ngan nelepon aranjeunna ngaliwatan protokol RPC na antara dua prosés.
Ayeuna kuring mutuskeun pikeun ngahubungi panyadia terraform langsung via telepon RPC. Tétéla éndah sareng ngamungkinkeun pikeun ngarobih panyadia terraform ka anu langkung énggal sareng nampi fitur énggal tanpa ngarobih kodeu. Tétéla ogé henteu sadayana widang di tfstate kedah aya dina tf, tapi kumaha anjeun tiasa terang? Ngan naroskeun ka panyadia anjeun ngeunaan ieu. Lajeng pornografi rekursif sejen tina assembling éksprési biasa dimimitian, néangan widang di jero tfstate di sakabéh tingkat di jero.

Tungtungna, kami ngagaduhan alat CLI anu kapaké anu gaduh infrastruktur umum pikeun sadaya panyadia terraform sareng anjeun tiasa nambihan anu énggal. Ogé, nambahkeun sumberdaya butuh saeutik kode. Tambih deui sagala jinis barang sapertos hubungan antara sumber daya. Tangtosna, aya seueur masalah anu henteu tiasa dijelaskeun sadayana.
Kuring ngaranna sato Terrafomer.

Finale

Nganggo Terrafomer, kami ngahasilkeun 500-700 rébu garis tf + kode tfstate tina dua awan. Kami tiasa nyandak hal-hal warisan sareng mimiti ngarampa aranjeunna ngan ukur ngalangkungan terraform, sapertos dina infrastruktur pangsaéna salaku ideu kode. Ieu ngan magic mun anjeun nyandak awan badag tur nampa eta ngaliwatan tim dina bentuk file worker terraform. Lajeng grep / ngaganti / git jeung saterusna.

Kuring combed kaluar teras nahan eta dina urutan, meunang idin. Dileupaskeun dina GitHub kanggo sadayana dinten Kemis (02.05.19/XNUMX/XNUMX). github.com/GoogleCloudPlatform/terraformer
Geus narima 600 béntang, 2 requests tarikan pikeun nambahkeun rojongan pikeun openstack na kubernetes. eupan balik alus. Sacara umum, proyék éta mangpaat pikeun jalma
Abdi mamatahan ka sadayana anu hoyong ngamimitian damel sareng Terraform sareng henteu nyerat deui sadayana pikeun ieu.
Kuring bakal bungah narik requests, masalah, béntang.

Demo
Terraformer - Infrastruktur Pikeun Code

sumber: www.habr.com

Tambahkeun komentar