Terraformer - Кодлох дэд бүтэц

Terraformer - Кодлох дэд бүтэц
Би хуучин асуудлыг шийдэхийн тулд бичсэн шинэ CLI хэрэглүүрийн талаар танд хэлэхийг хүсч байна.

асуудал

Terraform нь Devops/Cloud/IT нийгэмлэгт удаан хугацаагаар стандарт байсаар ирсэн. Энэ зүйл нь дэд бүтцийг код болгон шийдвэрлэхэд маш тохиромжтой бөгөөд ашигтай юм. Терраформд олон амттан, сэрээ, хурц хутга, тармуур байдаг.
Terraform-ийн тусламжтайгаар шинэ зүйл үүсгэж, дараа нь тэдгээрийг удирдах, өөрчлөх, устгахад маш тохиромжтой. Терраформоор бүтээгдээгүй, үүлэн доторх асар том дэд бүтэцтэй хүмүүс юу хийх ёстой вэ? Үүлийг бүхэлд нь дахин бичиж, дахин үүсгэх нь ямар нэгэн байдлаар үнэтэй бөгөөд аюулгүй биш юм.
Би ийм асуудалтай 2 ажил дээр тулгарсан, хамгийн энгийн жишээ бол та бүх зүйлийг Git-д terraform файл хэлбэрээр байлгахыг хүсч байгаа боловч танд 250 гаруй хувин байгаа бөгөөд үүнийг гараар terraform хэлбэрээр бичихэд маш их зүйл болно.
Байдаг асуудал 2014 оноос хойш 2016 онд хаагдсан terrafom-д импортын .

Ерөнхийдөө бүх зүйл зөвхөн баруунаас зүүн тийш зурган дээрх шиг байна

Анхааруулга: Зохиолч амьдралынхаа хагасыг Орост амьдардаггүй бөгөөд орос хэлээр бага бичдэг. Үг үсгийн алдаанаас болгоомжил.

Шийдэл

1. AWS-д зориулсан бэлэн болон хуучин шийдлүүд байдаг terraforming. Би 250 гаруй хувингаа түүгээр дамжуулан авах гэж оролдоход тэнд бүх зүйл муу байгааг ойлгосон. AWS нь маш олон шинэ сонголтуудыг нэвтрүүлсээр ирсэн боловч terraforming нь тэдний талаар мэдэхгүй бөгөөд ерөнхийдөө энэ нь бадмаараг юм. загвар нь сийрэг харагдаж байна. Орой 2 цагийн дараа би явуулсан Хүсэлт татах тэнд илүү олон боломжуудыг нэмж, ийм шийдэл нь огт тохиромжгүй гэдгийг ойлгосон.
Terraforming хэрхэн ажилладаг вэ: энэ нь AWS SDK-ээс өгөгдөл авч, загвараар дамжуулан tf болон tfstate үүсгэдэг.
Энд 3 асуудал байна:
1. Шинэчлэлтүүд үргэлж хоцрогдолтой байх болно
2. tf файлууд заримдаа эвдэрсэн байдаг
3. tfstate нь tf-ээс тусад нь цуглуулагддаг ба үргэлж нийлдэггүй
Ерөнхийдөө `terraform plan`-д өөрчлөлт ороогүй гэсэн үр дүнд хүрэхэд хэцүү байдаг

2. `terraform import` нь terraform-д суулгасан тушаал юм. Энэ яаж ажилдаг вэ?
Та нөөцийн нэр, төрлийг агуулсан хоосон TF файл бичиж, дараа нь "terraform import"-ыг ажиллуулж, нөөцийн ID-г дамжуулна уу. terraform нь үйлчилгээ үзүүлэгчтэй холбогдож, өгөгдлийг хүлээн авч, tfstate файл үүсгэдэг.
Энд 3 асуудал байна:
1. Бид зөвхөн tfstate файлыг авдаг бөгөөд tf хоосон байна, та үүнийг гараар бичих эсвэл tfstate-аас хөрвүүлэх хэрэгтэй.
2. Нэг удаад зөвхөн нэг нөөцтэй ажиллах боломжтой бөгөөд бүх нөөцийг дэмждэггүй. Тэгээд 250+ хувингаар би дахиад яах ёстой вэ?
3. Та нөөцийн ID-г мэдэх хэрэгтэй - өөрөөр хэлбэл нөөцийн жагсаалтыг авах кодоор боох хэрэгтэй.
Ерөнхийдөө үр дүн нь хэсэгчилсэн бөгөөд сайн масштабтай байдаггүй

Миний шийдвэр

Шаардлагууд:
1. Нөөцөд tf болон tfstate файл үүсгэх чадвар. Жишээлбэл, бүх хувин/аюулгүй байдлын бүлэг/ачаалал тэнцвэржүүлэгчийг татаж аваад, `terraform plan`-д ямар ч өөрчлөлт ороогүй гэж хариулсан.
2. Танд 2 GCP + AWS үүл хэрэгтэй
3. Тогтмол шинэчлэгдэх боломжтой, 3 өдрийн ажлын туршид нөөц бүрт цаг үрдэггүй глобал шийдэл
4. Нээлттэй эх сурвалжтай болго - хүн бүрт ижил асуудал тулгардаг

Go хэл нь надад таалагддаг бөгөөд энэ нь terraform-д хэрэглэгддэг HCL файлуудыг үүсгэх номын сантай + terraform-д хэрэг болох олон кодтой.

зам

Эхний оролдлого
Би энгийн хувилбараас эхэлсэн. Шаардлагатай нөөцийг авахын тулд SDK-ээр дамжуулан клоудтай холбогдож, терраформын талбар болгон хөрвүүлнэ. Зөвхөн хамгаалалтын бүлгийг хөрвүүлэх 1.5 хоног надад таалагдаагүй (мөн маш их нөөц байгаа) тул энэ оролдлого аюулгүй байдлын бүлэг дээр шууд үхсэн. Удаан хугацааны дараа талбаруудыг өөрчлөх/нэмэх боломжтой

Хоёр дахь оролдлого
Тайлбарласан санаан дээр үндэслэсэн энд. Зүгээр л tfstate-г аваад tf болгон хөрвүүлээрэй. Бүх өгөгдөл тэнд байгаа бөгөөд талбарууд нь ижил байна. Хэрхэн олон нөөцөд зориулж бүтэн tfstate авах вэ? Энд л "terraform refresh" команд аврах ажилд ирсэн юм. terraform нь tfstate-д байгаа бүх нөөцийг авч, ID-аар нь тэдгээр дээрх өгөгдлийг гаргаж аваад tfstate руу бүгдийг бичдэг. Өөрөөр хэлбэл, зөвхөн нэр, ID бүхий хоосон tfstate үүсгэж, `terraform refresh`-ийг ажиллуулаад бид бүтэн tfstate-г авна. Өө!
Одоо 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. spec - 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",

Ер нь хэн нэгэн ярилцлагад зориулж програмчлалын асуудал хүсч байвал энэ даалгаврыг задлан шинжлэгч бичихийг хүсээрэй :)
Алдаагүй задлан шинжлэгч бичих гэж олон оролдлого хийсний дараа би түүний нэг хэсгийг terraform кодоос, хамгийн чухал хэсгийг нь олсон. Тэгээд бүх зүйл хэвийн ажиллаж байгаа юм шиг санагдав

Гурав оролдлого
terraform үйлчилгээ үзүүлэгчид нь үүлэн API-тай ажиллах бүх нөөц, логик бүхий код агуулсан хоёртын файлууд юм. Үүл бүр өөрийн үйлчилгээ үзүүлэгчтэй бөгөөд terraform өөрөө зөвхөн хоёр процессын хоорондох RPC протоколоор дамжуулан тэдгээрийг дууддаг.
Одоо би RPC дуудлагаар дамжуулан terraform үйлчилгээ үзүүлэгчтэй шууд холбогдохоор шийдсэн. Энэ нь үзэсгэлэнтэй болж, кодыг өөрчлөхгүйгээр terraform үйлчилгээ үзүүлэгчийг шинэ болгон өөрчлөх, шинэ боломжуудыг авах боломжтой болсон. Мөн tfstate дахь бүх талбарууд tf-д байх ёсгүй, гэхдээ та яаж олж мэдэх вэ? Энэ талаар үйлчилгээ үзүүлэгчээсээ асуугаарай. Дараа нь tfstate доторх талбаруудыг бүх түвшинд гүнзгийрүүлэн хайж, тогтмол илэрхийлэл цуглуулах өөр нэг рекурсив порнограф эхэлсэн.

Эцэст нь бид бүх terraform үйлчилгээ үзүүлэгчдийн нийтлэг дэд бүтэцтэй CLI хэрэглүүрийг авсан бөгөөд та шинийг хялбархан нэмж болно. Мөн нөөц нэмэхэд бага хэмжээний код шаардагдана. Дээрээс нь нөөц хоорондын холболт гэх мэт бүх төрлийн сайн зүйлс. Мэдээжийн хэрэг, бүгдийг тайлбарлахын аргагүй олон янзын асуудал байсан.
Би амьтныг Террафомер гэж нэрлэсэн.

Төгсгөл

Terrafomer ашиглан бид хоёр үүлнээс 500-700 мянган мөр tf + tfstate кодыг үүсгэсэн. Бид хамгийн сайн дэд бүтцээр кодын санаанууд шиг зөвхөн terraform-ээр дамжуулан өв залгамжлагдсан зүйлсийг авч, тэдэнд хүрч эхэлсэн. Та асар том үүлийг аваад, багаар дамжуулж terraform worker файл хэлбэрээр хүлээн авах нь зүгээр л ид шид юм. Тэгээд grep/replace/git гэх мэт.

Самнаад цэгцлээд зөвшөөрөл авсан. Пүрэв гарагт (02.05.19/XNUMX/XNUMX) GitHub дээр гарсан. github.com/GoogleCloudPlatform/terraformer
Аль хэдийн 600 од, нээлттэй стек болон кубернетэд дэмжлэг нэмэх 2 татах хүсэлтийг хүлээн авсан. Сайн санал. Ер нь бол хүмүүст хэрэгтэй төсөл
Би Terraform-тэй ажиллаж эхлэхийг хүсч байгаа бүх хүмүүст зөвлөж, үүний тулд бүгдийг дахин бичихгүй байхыг зөвлөж байна.
Би хүсэлт, асуудал, оддыг татахдаа баяртай байх болно.

Демо
Terraformer - Кодлох дэд бүтэц

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх