Terraformer - Kodlama üçün İnfrastruktur

Terraformer - Kodlama üçün İnfrastruktur
Sizə köhnə problemi həll etmək üçün yazdığım yeni CLI alətindən danışmaq istərdim.

problem

Terraform uzun müddətdir Devops/Cloud/IT icmasında standart olmuşdur. Obyekt kod kimi infrastrukturla işləmək üçün çox rahat və faydalıdır. Terraformda çoxlu ləzzətlər, eləcə də çoxlu çəngəllər, iti bıçaqlar və dırmıqlar var.
Terraform ilə yeni şeylər yaratmaq və sonra onları idarə etmək, dəyişdirmək və ya silmək çox rahatdır. Buludda nəhəng infrastrukturu olan və Terraform vasitəsilə yaradılmayanlar nə etməlidir? Bütün buludu yenidən yazmaq və yenidən yaratmaq bir növ bahalı və təhlükəlidir.
Mən bu problemlə 2 işdə rastlaşdım, ən sadə misal odur ki, siz hər şeyin Git-də terraform faylları şəklində olmasını istəyirsiniz, lakin sizdə 250+ vedrə var və onları əl ilə terraformda yazmaq çox işdir.
Yoxdur buraxılış 2014-cü ildən bu yana 2016-cı ildə bağlanan terrafom idxalı olacağı ümidi ilə.

Ümumiyyətlə, hər şey şəkildəki kimi yalnız sağdan sola doğrudur

Xəbərdarlıq: Müəllif ömrünün yarısını Rusiyada yaşamır və rus dilində az yazır. Orfoqrafik səhvlərdən çəkinin.

Çözümlər

1. AWS üçün hazır və köhnə həll var terraformasiya. 250+ vedrəmi oradan keçirməyə çalışanda orada hər şeyin pis olduğunu başa düşdüm. AWS çoxdan bir çox yeni seçimlər təqdim edir, lakin terraformasiya onlar haqqında bilmir və ümumiyyətlə, yaqutdur şablon seyrək görünür. Axşam saat 2-dən sonra göndərdim Sorğu çəkin orada daha çox xüsusiyyət əlavə etmək və belə bir həllin heç də uyğun olmadığını başa düşdü.
Terraformasiya necə işləyir: o, AWS SDK-dan məlumatları götürür və şablon vasitəsilə tf və tfstate yaradır.
Burada 3 problem var:
1. Yeniləmələrdə həmişə gecikmə olacaq
2. tf faylları bəzən xarab olur
3. tfstate tf-dən ayrı toplanır və həmişə yaxınlaşmır
Ümumiyyətlə, `terraform planında` heç bir dəyişiklik olmadığını bildirən nəticə əldə etmək çətindir

2. `terraform import` terraformda daxili əmrdir. Bu necə işləyir?
Siz resursun adı və növü ilə boş TF faylı yazın, sonra `terraform import`u işə salın və resurs identifikatorunu keçirin. terraform provayderlə əlaqə saxlayır, məlumatları alır və tfstate faylı yaradır.
Burada 3 problem var:
1. Biz yalnız bir tfstate faylı alırıq və tf boşdur, onu əl ilə yazmaq və ya tfstate-dən çevirmək lazımdır
2. Eyni zamanda yalnız bir resursla işləyə bilər və bütün resursları dəstəkləmir. 250+ vedrə ilə yenə nə etməliyəm?
3. Resursların identifikatorunu bilməlisiniz - yəni onu resursların siyahısını əldə edən koda bükmək lazımdır.
Ümumiyyətlə, nəticə qisməndir və yaxşı miqyasda deyil

Mənim qərarım

tələblər:
1. Resurslar üçün tf və tfstate faylları yaratmaq imkanı. Məsələn, bütün vedrələri/təhlükəsizlik qrupunu/yük balanslaşdırıcısını endirin və həmin “terraform planı” heç bir dəyişiklik olmadığını bildirdi
2. Sizə 2 GCP + AWS bulud lazımdır
3. Hər dəfə yeniləmək asan və 3 günlük iş üçün hər resursda vaxt itirməyən qlobal həll
4. Açıq mənbə edin - hamının eyni problemi var

Go dili ona görə onu sevirəm və onun terraformda istifadə olunan HCL faylları yaratmaq üçün kitabxanası var + terraformda faydalı ola biləcək çoxlu kod

Yol

İlk cəhd
Sadə bir versiya ilə başladım. Tələb olunan resurs üçün SDK vasitəsilə buludla əlaqə saxlamaq və onu terraform üçün sahələrə çevirmək. Cəhd dərhal təhlükəsizlik qrupunda öldü, çünki yalnız təhlükəsizlik qrupunu çevirmək üçün 1.5 gün xoşuma gəlmədi (və çoxlu resurs var). Uzun müddət və sonra sahələr dəyişdirilə / əlavə edilə bilər

İkinci cəhd
Təsvir edilən fikir əsasında burada. Sadəcə götürün və tfstate-i tf-ə çevirin. Bütün məlumatlar oradadır və sahələr eynidir. Bir çox resurs üçün tam tfstate əldə etmək olar? Burada “terraformanı yeniləmək” əmri köməyə gəldi. terraform tfstate-də bütün resursları götürür və ID ilə onlar haqqında məlumatları çıxarır və hər şeyi tfstate-ə yazır. Yəni, yalnız adları və identifikatorları olan boş bir tfstate yaradın, `terraform refresh'i işə salın və sonra tam tfstates alırıq. Yaşasın!
İndi gəlin tfstate üçün tf-ə çevirici yazmaq üçün rekursiv pornoqrafiya edək. Heç vaxt tfstate oxumayanlar üçün bu JSON, lakin xüsusidir.
Budur onun mühüm hissəsi atributları

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

var:
1. id - sətir
2. metadata - 1 ölçülü massiv və onun içərisində aşağıda təsvir olunan sahələri olan obyekt
3. spec - ölçüsü 1 və açarın hash, içindəki dəyər
Bir sözlə, əyləncəli format, hər şey bir neçə səviyyəli dərinlikdə ola bilər

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

Ümumiyyətlə, hər kəs müsahibə üçün proqramlaşdırma problemi istəyirsə, ondan bu tapşırığın yerinə yetirilməsi üçün təhlilçi yazmasını xahiş edin :)
Səhvləri olmayan bir analizator yazmaq üçün bir çox cəhddən sonra onun bir hissəsini terraform kodunda, ən vacib hissəsini isə tapdım. Və hər şey yaxşı işləyirdi

Üç cəhd
terraform provayderləri bulud API ilə işləmək üçün bütün resursları və məntiqi olan kodu ehtiva edən ikili fayllardır. Hər bir buludun öz provayderi var və terraformun özü onları yalnız iki proses arasında RPC protokolu vasitəsilə çağırır.
İndi mən RPC zəngləri vasitəsilə birbaşa terraform provayderləri ilə əlaqə saxlamaq qərarına gəldim. Çox gözəl çıxdı və kodu dəyişmədən terraform provayderlərini daha yenilərinə dəyişməyə və yeni funksiyalar əldə etməyə imkan verdi. Həm də belə çıxır ki, tfstate-də bütün sahələr tf-də olmamalıdır, amma bunu necə tapmaq olar? Bu barədə provayderinizdən soruşun. Sonra müntəzəm ifadələrin yığılmasının başqa bir rekursiv pornoqrafiyası başladı, tfstate daxilində bütün səviyyələrdə dərinlikdə sahələri axtardı.

Sonda bütün terraform provayderləri üçün ümumi infrastruktura malik faydalı CLI aləti əldə etdik və siz asanlıqla yenisini əlavə edə bilərsiniz. Həmçinin, resursların əlavə edilməsi az kod tələb edir. Üstəlik, resurslar arasında əlaqələr kimi hər cür yaxşılıqlar. Təbii ki, hamısını təsvir etmək mümkün olmayan çoxlu müxtəlif problemlər var idi.
Mən heyvana Terrafomer adını verdim.

Final

Terrafomerdən istifadə edərək iki buluddan 500-700 min sətir tf + tfstate kodu yaratdıq. Biz miras qalmış əşyaları götürə bildik və onlara kod ideyaları kimi ən yaxşı infrastrukturda olduğu kimi yalnız terraform vasitəsilə toxunmağa başladıq. Nəhəng bir bulud götürüb onu terraform işçi faylları şəklində bir komanda vasitəsilə qəbul edərkən bu, sadəcə sehrdir. Və sonra grep/replace/git və s.

Onu darayıb sıraya qoydum, icazə aldım. GitHub-da hər kəs üçün cümə axşamı (02.05.19/XNUMX/XNUMX) buraxıldı. github.com/GoogleCloudPlatform/terraformer
Artıq 600 ulduz, openstack və kubernetlər üçün dəstək əlavə etmək üçün 2 çəkmə sorğusu qəbul edilib. Yaxşı rəy. Ümumiyyətlə, layihə insanlar üçün faydalıdır
Terraform ilə işləməyə başlamaq istəyən hər kəsə məsləhət görürəm və bunun üçün hər şeyi yenidən yazmayın.
İstəkləri, problemləri, ulduzları çəkməkdən məmnun olaram.

Demo
Terraformer - Kodlama üçün İnfrastruktur

Mənbə: www.habr.com

Добавить комментарий