Terraformer - Infrastruktur Kepada Kod

Terraformer - Infrastruktur Kepada Kod
Saya ingin memberitahu anda tentang alat CLI baharu yang saya tulis untuk menyelesaikan masalah lama.

masalah

Terraform telah lama menjadi standard dalam komuniti Devops/Cloud/IT. Perkara itu sangat mudah dan berguna untuk menangani infrastruktur sebagai kod. Terdapat banyak keseronokan dalam Terraform serta banyak garpu, pisau tajam dan garu.
Dengan Terraform adalah sangat mudah untuk mencipta perkara baharu dan kemudian mengurus, menukar atau memadamnya. Apakah yang perlu dilakukan oleh mereka yang mempunyai infrastruktur besar dalam awan dan tidak dibuat melalui Terraform? Menulis semula dan mencipta semula keseluruhan awan entah bagaimana mahal dan tidak selamat.
Saya menghadapi masalah ini pada 2 kerja, contoh paling mudah ialah apabila anda mahu segala-galanya berada dalam Git dalam bentuk fail terraform, tetapi anda mempunyai 250+ baldi dan anda perlu menulisnya dalam terraform dengan tangan.
Terdapat isu sejak 2014 di terrafom yang ditutup pada 2016 dengan harapan akan ada import.

Secara umum, semuanya seperti dalam gambar sahaja dari kanan ke kiri

Amaran: Penulis tidak tinggal di Rusia selama separuh hayatnya dan menulis sedikit dalam bahasa Rusia. Berhati-hati dengan kesilapan ejaan.

Penyelesaian

1. Terdapat penyelesaian sedia dan lama untuk AWS terraforming. Apabila saya cuba untuk mendapatkan 250+ baldi saya melaluinya, saya menyedari bahawa semuanya buruk di sana. AWS telah lama memperkenalkan banyak pilihan baharu, tetapi terraforming tidak mengetahui tentangnya dan secara amnya ia adalah delima templat kelihatan jarang. Selepas 2 petang saya menghantar Permintaan tarik untuk menambah lebih banyak ciri di sana dan menyedari bahawa penyelesaian sedemikian tidak sesuai sama sekali.
Cara terraforming berfungsi: ia mengambil data daripada SDK AWS dan menjana tf dan tfstate melalui templat.
Terdapat 3 masalah di sini:
1. Akan sentiasa ada ketinggalan dalam kemas kini
2. fail tf kadang-kadang keluar rosak
3. tfstate dikumpul secara berasingan daripada tf dan tidak selalu menumpu
Secara umum, sukar untuk mendapatkan hasil yang mana `pelan terraform` mengatakan bahawa tiada perubahan

2. `import terraform` ialah arahan terbina dalam dalam terraform. Bagaimanakah ia berfungsi?
Anda menulis fail TF kosong dengan nama dan jenis sumber, kemudian jalankan `terraform import` dan lulus ID sumber. terraform menghubungi pembekal, menerima data dan membuat fail tfstate.
Terdapat 3 masalah di sini:
1. Kami hanya mendapat fail tfstate, dan tf kosong, anda perlu menulisnya secara manual atau menukarnya daripada tfstate
2. Hanya boleh bekerja dengan satu sumber pada satu masa dan tidak menyokong semua sumber. Dan apakah yang perlu saya lakukan sekali lagi dengan 250+ baldi?
3. Anda perlu mengetahui ID sumber - iaitu, anda perlu membungkusnya dalam kod yang mendapat senarai sumber
Secara umum, hasilnya adalah separa dan tidak berskala dengan baik

Keputusan saya

Keperluan:
1. Keupayaan untuk mencipta fail tf dan tfstate untuk sumber. Contohnya, muat turun semua baldi/kumpulan keselamatan/pengimbang beban dan `pelan terraform` mengembalikan bahawa tiada perubahan
2. Anda memerlukan 2 awan GCP + AWS
3. Penyelesaian global yang mudah dikemas kini setiap masa dan tidak membuang masa pada setiap sumber selama 3 hari bekerja
4. Jadikan Sumber Terbuka - semua orang mempunyai masalah yang sama

Bahasa Go adalah sebab saya menyukainya, dan ia mempunyai perpustakaan untuk mencipta fail HCL yang digunakan dalam terraform + banyak kod dalam terraform yang boleh berguna

Jalan

Cuba terlebih dahulu
Saya mulakan dengan versi mudah. Menghubungi awan melalui SDK untuk mendapatkan sumber yang diperlukan dan menukarnya menjadi medan untuk terraform. Percubaan itu mati serta-merta pada kumpulan keselamatan kerana saya tidak suka 1.5 hari untuk menukar kumpulan keselamatan sahaja (dan terdapat banyak sumber). Untuk masa yang lama dan kemudian medan boleh ditukar/ditambah

Percubaan kedua
Berdasarkan idea yang diterangkan di sini. Hanya ambil dan tukar tfstate kepada tf. Semua data ada dan medan adalah sama. Bagaimana untuk mendapatkan tfstate penuh untuk banyak sumber?? Di sinilah arahan `terraform refresh` datang untuk menyelamatkan. terraform mengambil semua sumber dalam tfstate dan, dengan ID, mengeluarkan data pada mereka dan menulis segala-galanya ke tfstate. Iaitu, buat tfstate kosong dengan hanya nama dan ID, jalankan `terraform refresh` dan kemudian kami mendapat tfstates penuh. Hooray!
Sekarang mari kita lakukan pornografi rekursif untuk menulis penukar untuk tfstate kepada tf. Bagi mereka yang tidak pernah membaca tfstate, ia adalah JSON, tetapi istimewa.
Berikut adalah atribut bahagian pentingnya

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

Terdapat:
1. id - rentetan
2. metadata - tatasusunan saiz 1 dan di dalamnya objek dengan medan yang diterangkan di bawah
3. spec - cincang saiz 1 dan kunci, nilai di dalamnya
Pendek kata, format yang menyeronokkan, semuanya boleh menjadi beberapa peringkat dalam

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

Secara amnya, jika sesiapa mahukan masalah pengaturcaraan untuk temu duga, minta mereka menulis parser untuk tugasan ini :)
Selepas banyak percubaan untuk menulis parser tanpa pepijat, saya menemui sebahagian daripadanya dalam kod terraform, dan bahagian yang paling penting. Dan semuanya kelihatan berfungsi dengan baik

Percubaan tiga
pembekal terraform ialah binari yang mengandungi kod dengan semua sumber dan logik untuk bekerja dengan API awan. Setiap awan mempunyai pembekal sendiri dan terraform sendiri hanya memanggil mereka melalui protokol RPC antara dua proses.
Sekarang saya memutuskan untuk menghubungi penyedia terraform secara terus melalui panggilan RPC. Ia ternyata cantik dan memungkinkan untuk menukar penyedia terraform kepada yang lebih baharu dan mendapatkan ciri baharu tanpa mengubah kod. Ternyata tidak semua medan dalam tfstate harus berada dalam tf, tetapi bagaimana anda boleh mengetahuinya? Cuma tanya pembekal anda tentang perkara ini. Kemudian satu lagi pornografi rekursif untuk memasang ungkapan biasa bermula, mencari medan di dalam tfstate di semua peringkat secara mendalam.

Akhirnya, kami mendapat alat CLI berguna yang mempunyai infrastruktur yang sama untuk semua penyedia terraform dan anda boleh menambah yang baharu dengan mudah. Selain itu, menambah sumber memerlukan sedikit kod. Ditambah dengan segala macam kebaikan seperti hubungan antara sumber. Sudah tentu, terdapat banyak masalah berbeza yang tidak dapat dihuraikan semua.
Saya menamakan haiwan itu Terrafomer.

Akhir

Menggunakan Terrafomer, kami menjana 500-700 ribu baris kod tf + tfstate daripada dua awan. Kami dapat mengambil perkara warisan dan mula menyentuhnya hanya melalui terraform, seperti dalam infrastruktur terbaik sebagai idea kod. Sungguh ajaib apabila anda mengambil awan besar dan menerimanya melalui pasukan dalam bentuk fail pekerja terraform. Dan kemudian grep/replace/git dan seterusnya.

Saya menyikatnya dan menyusunnya, mendapat kebenaran. Dikeluarkan di GitHub untuk semua orang pada hari Khamis (02.05.19/XNUMX/XNUMX). github.com/GoogleCloudPlatform/terraformer
Sudah menerima 600 bintang, 2 permintaan tarik untuk menambah sokongan untuk openstack dan kubernetes. Maklum balas yang baik. Secara umum, projek ini berguna untuk orang ramai
Saya menasihati semua orang yang ingin mula bekerja dengan Terraform dan tidak menulis semula segala-galanya untuk ini.
Saya akan gembira untuk menarik permintaan, isu, bintang.

Demo
Terraformer - Infrastruktur Kepada Kod

Sumber: www.habr.com

Tambah komen