Terraformer - Infrastruktur Ke Kode

Terraformer - Infrastruktur Ke Kode
Saya ingin memberi tahu Anda tentang alat CLI baru yang saya tulis untuk memecahkan masalah lama.

masalah

Terraform telah lama menjadi standar di komunitas Devops/Cloud/IT. Masalahnya sangat nyaman dan berguna untuk menangani infrastruktur sebagai kode. Ada banyak kelezatan di Terraform serta banyak garpu, pisau tajam, dan garu.
Dengan Terraform, sangat mudah untuk membuat hal-hal baru dan kemudian mengelola, mengubah, atau menghapusnya. Apa yang harus dilakukan oleh mereka yang memiliki infrastruktur besar di cloud dan tidak dibuat melalui Terraform? Menulis ulang dan membuat ulang seluruh cloud memerlukan biaya yang mahal dan tidak aman.
Saya mengalami masalah ini di 2 pekerjaan, contoh paling sederhana adalah ketika Anda ingin semuanya ada di Git dalam bentuk file terraform, tetapi Anda memiliki 250+ ember dan banyak yang harus menulisnya dalam terraform dengan tangan.
Ada isu sejak tahun 2014 di terrafom yang ditutup pada tahun 2016 dengan harapan ada import.

Secara umum semuanya seperti pada gambar hanya dari kanan ke kiri

Peringatan: Penulis tidak tinggal di Rusia selama separuh hidupnya dan hanya menulis sedikit dalam bahasa Rusia. Waspadalah terhadap kesalahan ejaan.

Solusi

1. Ada solusi lama dan siap pakai untuk AWS terraforming. Ketika saya mencoba menyelesaikan 250+ ember saya, saya menyadari bahwa semuanya buruk di sana. AWS telah lama memperkenalkan banyak opsi baru, tetapi terraforming tidak mengetahuinya dan secara umum itu adalah rubi templatnya terlihat jarang. Setelah jam 2 malam saya kirim Tarik permintaan untuk menambahkan lebih banyak fitur di sana dan menyadari bahwa solusi seperti itu tidak cocok sama sekali.
Cara kerja terraforming: mengambil data dari AWS SDK dan menghasilkan tf dan tfstate melalui templat.
Ada 3 masalah di sini:
1. Akan selalu ada kelambatan dalam pembaruan
2. file tf terkadang keluar rusak
3. tfstate dikumpulkan secara terpisah dari tf dan tidak selalu menyatu
Secara umum, sulit untuk mendapatkan hasil yang `rencana terraform` menyatakan tidak ada perubahan

2. `terraform import` adalah perintah bawaan di terraform. Bagaimana cara kerjanya?
Anda menulis file TF kosong dengan nama dan jenis sumber daya, lalu menjalankan `terraform import` dan meneruskan ID sumber daya. terraform menghubungi penyedia, menerima data dan membuat file tfstate.
Ada 3 masalah di sini:
1. Kami hanya mendapatkan file tfstate, dan tfnya kosong, Anda perlu menulisnya secara manual atau mengonversinya dari tfstate
2. Hanya dapat bekerja dengan satu sumber daya dalam satu waktu dan tidak mendukung semua sumber daya. Dan apa yang harus saya lakukan lagi dengan 250+ ember?
3. Anda perlu mengetahui ID sumber daya - yaitu, Anda perlu membungkusnya dalam kode yang mendapatkan daftar sumber daya
Secara umum, hasilnya bersifat parsial dan tidak terukur dengan baik

Keputusanku

Persyaratan:
1. Kemampuan untuk membuat file tf dan tfstate untuk sumber daya. Misalnya, unduh semua bucket/grup keamanan/penyeimbang beban dan `rencana terraform` dikembalikan bahwa tidak ada perubahan
2. Anda memerlukan 2 cloud GCP + AWS
3. Solusi global yang mudah diupdate setiap saat dan tidak membuang waktu pada setiap resource selama 3 hari kerja
4. Jadikan Open Source - setiap orang mempunyai masalah yang sama

Bahasa Go adalah alasan saya menyukainya, dan memiliki perpustakaan untuk membuat file HCL yang digunakan di terraform + banyak kode di terraform yang dapat berguna

Jalan

Coba dulu
Saya mulai dengan versi sederhana. Menghubungi cloud melalui SDK untuk sumber daya yang diperlukan dan mengubahnya menjadi bidang untuk terraform. Upaya tersebut langsung terhenti pada grup keamanan karena saya tidak suka 1.5 hari hanya mengonversi grup keamanan (dan ada banyak sumber daya). Untuk waktu yang lama dan kemudian bidang dapat diubah/ditambahkan

Usaha kedua
Berdasarkan ide yang dijelaskan di sini. Ambil saja dan ubah tfstate menjadi tf. Semua datanya ada dan kolomnya sama. Bagaimana cara mendapatkan tfstate penuh untuk banyak sumber daya?? Di sinilah perintah `terraform refresh` membantu. terraform mengambil semua sumber daya di tfstate dan, berdasarkan ID, mengeluarkan datanya dan menulis semuanya ke tfstate. Artinya, buat tfstate kosong hanya dengan nama dan ID, jalankan `terraform refresh` dan kemudian kita mendapatkan tfstates penuh. Hore!
Sekarang mari kita lakukan pornografi rekursif dengan menulis konverter untuk tfstate ke tf. Bagi yang belum pernah membaca tfstate, ini JSON, tapi istimewa.
Inilah bagian pentingnya atribut

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

Ada:
1.id - tali
2. metadata - array berukuran 1 dan di dalamnya terdapat objek dengan bidang yang dijelaskan di bawah
3. spec - hash ukuran 1 dan kunci, nilai di dalamnya
Singkatnya, format yang menyenangkan, semuanya bisa memiliki kedalaman beberapa level

                   "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 umum, jika ada yang menginginkan masalah pemrograman untuk wawancara, minta saja mereka menulis parser untuk tugas ini :)
Setelah banyak upaya untuk menulis parser tanpa bug, saya menemukan sebagian di kode terraform, dan bagian terpenting. Dan semuanya tampak berjalan dengan baik

Coba ketiga
penyedia terraform adalah biner yang berisi kode dengan semua sumber daya dan logika untuk bekerja dengan API cloud. Setiap cloud memiliki penyedianya sendiri dan terraform sendiri hanya memanggilnya melalui protokol RPC antara dua proses.
Sekarang saya memutuskan untuk menghubungi penyedia terraform secara langsung melalui panggilan RPC. Ternyata indah dan memungkinkan untuk mengubah penyedia terraform ke yang lebih baru dan mendapatkan fitur baru tanpa mengubah kode. Ternyata tidak semua field di tfstate harus ada di tf, tapi bagaimana cara mengetahuinya? Tanyakan saja pada penyedia Anda tentang hal ini. Kemudian pornografi rekursif lainnya dalam menyusun ekspresi reguler dimulai, mencari bidang di dalam tfstate di semua tingkatan secara mendalam.

Pada akhirnya, kami mendapatkan alat CLI berguna yang memiliki infrastruktur umum untuk semua penyedia terraform dan Anda dapat dengan mudah menambahkan yang baru. Selain itu, menambahkan sumber daya hanya membutuhkan sedikit kode. Ditambah segala macam barang seperti koneksi antar sumber daya. Tentu saja, ada banyak masalah berbeda yang tidak dapat dijelaskan semuanya.
Saya menamai hewan itu Terrafomer.

Final

Menggunakan Terrafomer, kami menghasilkan 500-700 ribu baris kode tf + tfstate dari dua cloud. Kami dapat mengambil hal-hal lama dan mulai menyentuhnya hanya melalui terraform, sebagai infrastruktur terbaik sebagai ide kode. Sungguh ajaib ketika Anda mengambil cloud besar dan menerimanya melalui tim dalam bentuk file pekerja terraform. Dan kemudian grep/replace/git dan seterusnya.

Saya menyisirnya dan menatanya, mendapat izin. Dirilis di GitHub untuk semua orang pada Kamis (02.05.19/XNUMX/XNUMX). github.com/GoogleCloudPlatform/terraformer
Sudah menerima 600 bintang, 2 permintaan tarik untuk menambahkan dukungan untuk openstack dan kubernetes. Umpan balik yang bagus. Secara umum, proyek ini bermanfaat bagi masyarakat
Saya menyarankan semua orang yang ingin mulai bekerja dengan Terraform dan tidak menulis ulang semuanya untuk ini.
Saya akan dengan senang hati menarik permintaan, masalah, bintang.

Demonstrasi
Terraformer - Infrastruktur Ke Kode

Sumber: www.habr.com

Tambah komentar