Terraformer - Infrastruktur Untuk Kode

gambar
Saya ingin berbicara tentang alat CLI baru yang saya tulis untuk menyelesaikan satu masalah lama.

Masalah


Terraform telah lama menjadi standar di komunitas Devops / Cloud / IT. Masalahnya sangat nyaman dan berguna untuk melakukan infrastruktur sebagai kode. Ada banyak pesona di Terraform serta banyak garpu, pisau tajam, dan garu.
Dengan Terraform, sangat mudah untuk melakukan hal-hal baru dan kemudian mengelola, mengubah atau menghapusnya. Dan bagaimana dengan mereka yang memiliki infrastruktur besar di cloud dan tidak diciptakan melalui Terraform? Menulis ulang dan membuat ulang seluruh cloud itu mahal dan tidak aman.
Saya mengalami masalah seperti itu dalam 2 karya, contoh paling sederhana adalah ketika Anda ingin semuanya dalam bentuk file terraform, dan Anda memiliki lebih dari 250 ember dan menulis banyak untuk terraform dengan tangan Anda.
Ada masalah sejak 2014 di terrafom yang ditutup pada 2016 dengan harapan akan ada impor.

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


Peringatan: Penulis tidak tinggal di Rusia selama setengah hidupnya dan menulis sedikit dalam bahasa Rusia. Perhatian kesalahan pengejaan

Solusi


1. Ada solusi turnkey dan lama untuk AWS terraforming . Ketika saya mencoba untuk mendapatkan 250+ ember saya melalui itu, saya menyadari bahwa semuanya buruk di sana. AWS telah mengeluarkan banyak opsi baru untuk waktu yang lama dan terraforming tidak tahu tentang mereka dan secara umum memiliki template ruby yang terlihat buruk . Setelah jam 2 malam saya mengirim permintaan Tarik untuk menambahkan lebih banyak fitur di sana dan menyadari bahwa solusi seperti itu tidak cocok sama sekali.
Bagaimana terraforming bekerja, dibutuhkan data dari AWS SDK dan menghasilkan tf dan tfstate melalui templat.
Ada 3 masalah:
1. Akan selalu ada jaminan simpanan dalam pembaruan
2. file tf kadang-kadang rusak
3. Negara dikumpulkan secara terpisah dari tf dan tidak selalu bertemu
Secara umum, sulit untuk mendapatkan hasil di mana `rencana terraform` akan mengatakan bahwa tidak ada perubahan

2. `terraform import` - perintah bawaan di terraform. Bagaimana cara kerjanya?
Anda menulis file TF kosong dengan nama dan jenis sumber daya, kemudian Anda menjalankan `terraform import` dan mentransfer ID sumber daya. terraform memanggil penyedia menerima data dan membuat file tfstate.
Ada 3 masalah:
1. Kami hanya mendapatkan file tfstate dan tf kosong harus ditulis atau dikonversi dengan tfstate
2. Mampu bekerja dengan hanya satu sumber daya setiap kali 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 harus membungkusnya dengan kode yang mendapatkan daftar sumber daya
Secara umum, hasilnya parsial dan tidak skala dengan baik

Keputusan saya

Persyaratan:
1. Kemampuan untuk membuat file tf dan tfstate oleh sumber daya. Misalnya, unduh semua bucket / grup keamanan / penyeimbang beban dan `rencana terraform` mengembalikan bahwa tidak ada perubahan
2. Diperlukan 2 awan GCP + AWS
3. Solusi global yang mudah diperbarui setiap waktu dan tidak membuang waktu untuk setiap sumber daya selama 3 hari kerja
4. Jadikan Open source - setiap orang memiliki masalah seperti itu

Pergi bahasa - itu sebabnya saya menyukainya, dan memiliki perpustakaan untuk membuat file HCL yang digunakan dalam terraform + banyak kode dalam terraform yang dapat berguna

Jalan


Upaya pertama
Memulai opsi sederhana. Akses ke cloud melalui SDK untuk sumber daya yang diinginkan dan mengubahnya menjadi bidang untuk terraform. Upaya itu langsung mati pada grup keamanan karena saya tidak suka 1,5 hari untuk mengkonversi hanya grup keamanan (dan ada banyak sumber daya). Kolom yang panjang dan kemudian dapat diubah / ditambahkan

Upaya kedua
Berdasarkan ide yang dijelaskan di sini . Ambil dan ubah tfstate menjadi tf. Semua data ada di sana dan bidangnya sama. Bagaimana cara mendapatkan banyak sumber daya? Kemudian perintah `terraform refresh` datang untuk menyelamatkan. terraform mengambil semua sumber daya di tfstate dan mengeluarkan data dengan ID dan menulis semuanya untuk tfstate. Artinya, buat tfstate kosong dengan hanya nama dan ID, jalankan `terraform refresh`, kami mendapatkan tfstate lengkap. Hore!
Sekarang mari kita lakukan pornografi rekursif menulis konverter untuk tfstate ke tf. Bagi mereka yang belum pernah membaca tfstate, ini JSON, tetapi spesial.
Inilah atribut bagian 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", 

Ada:
1. id - string
2. metadata - array ukuran 1 dan di dalamnya objek dengan bidang yang dijelaskan di bawah ini
3. spec - hash ukuran 1 dan di dalamnya kunci, nilai
Singkatnya, format yang menyenangkan, semuanya bisa mendalam juga di beberapa tingkatan
  "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, yang menginginkan tugas pemrograman untuk wawancara, cukup minta untuk menulis parser untuk masalah ini :)
Setelah upaya panjang untuk menulis parser tanpa bug, saya menemukan sebagian darinya dalam kode terraform, dan bagian yang paling penting. Dan semuanya tampak bekerja dengan baik

Percobaan tiga
penyedia terraform adalah biner di mana ada kode dengan semua sumber daya dan logika untuk bekerja dengan cloud API. Setiap cloud memiliki penyedia sendiri dan terraform sendiri hanya memanggil mereka melalui protokol RPC antara dua proses.
Sekarang saya memutuskan untuk mengakses penyedia terraform secara langsung melalui panggilan RPC. Ternyata indah dan memungkinkan untuk mengubah penyedia terraform ke yang lebih baru dan mendapatkan peluang baru tanpa mengubah kode. Ternyata tidak semua bidang di tfstate seharusnya ada di tf, tetapi bagaimana saya bisa mengetahuinya? Tanyakan kepada penyedia tentang hal ini. Kemudian pornografi rekursif lain tentang kumpulan ekspresi reguler dimulai dengan pencarian dengan mencari bidang di dalam negara pada semua tingkatan secara mendalam.

Pada akhirnya, kami mendapatkan alat CLI yang berguna yang memiliki infrastruktur umum untuk semua penyedia terraform dan Anda dapat dengan mudah menambahkan yang baru. Juga menambahkan sumber daya membutuhkan sedikit kode. Ditambah segala macam barang seperti koneksi antara sumber daya. Tentu saja ada banyak masalah berbeda yang semuanya tidak bisa dijelaskan.
Dia memanggil binatang kecil Terrafomer.

Terakhir


Menggunakan Terrafomer, kami menghasilkan 500-700 ribu baris kode tf + tfstate dari dua awan. Mereka dapat mengambil barang-barang warisan dan mulai menyentuhnya hanya melalui terraform seperti pada gagasan terbaik infrastruktur sebagai kode. Itu hanya ajaib ketika Anda mengambil cloud besar dan mendapatkannya melalui perintah dalam bentuk file kerja terraform. Dan kemudian grep / replace / git dan sebagainya.

Dia menyisir dan menertibkan, menerima izin. Dirilis di github untuk semua pada hari Kamis (05/02/19). github.com/GoogleCloudPlatform/terraformer
Sudah menerima 600 bintang, 2 permintaan tarik menambahkan dukungan untuk openstack dan kubernet. Ulasan bagus Secara umum, proyek ini bermanfaat bagi orang
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.

Demo


Pembaruan: mengacaukan dukungan Openstack minimal dan dukungan kubernetes hampir siap, terima kasih kepada orang-orang untuk PR

Source: https://habr.com/ru/post/id450410/


All Articles