Bagaimana saya harus menyimpan variabel lingkungan saya?

11

Ini adalah pertanyaan yang sangat luas tentang metode dan saran mengenai variabel / struktur lingkungan. Tetapi pada akhirnya saya mencari jawaban untuk pertanyaan yang sangat spesifik tentang 'Bagaimana saya harus menyimpan variabel lingkungan saya?'

Pertama beberapa klarifikasi:

  • Lingkungan bagi saya bisa dari 3 hingga 10 server dan merupakan cara untuk memuat infrastruktur pelanggan tertentu.
  • Di dalam setiap lingkungan ada beberapa variabel yang sebagian besar secara otomatis dihasilkan dari beberapa input kunci (nama, ukuran dll).

Seperti yang ada sekarang kita menyimpan semua variabel lingkungan kita dalam struktur seperti:

<playbook>.yml                   # Various playbooks for deployment
roles/windows                    # Ansible role for Ubuntu
roles/ubuntu                     # Ansible role for Ubuntu
config/hosts/<name>.yml          # Ansible inventory
config/hosts/vars/<name>.json    # Environment specific variables 

Sekarang konfigurasi diinisialisasi sebagai submodule di repositori git di atas. Karena variabel file berubah agak sering hal ini menyebabkan masalah dengan perubahan data, sekali, dua kali atau bahkan tiga kali antara komitmen membuat perubahan semakin sulit dilacak.

Seperti yang saya secara pribadi melihatnya maju, kita harus mencari untuk menyimpan semua variabel pelanggan kami secara terpusat / scalable dan kemudian menghubungkannya dengan inventaris dinamis dengan .

Saya mengerti ada beberapa teknologi yang tampaknya melakukan bagian dari apa yang mungkin diperlukan seperti Konsul tetapi mereka tampaknya bekerja paling baik di lingkungan yang melayani satu aplikasi besar daripada banyak yang lebih kecil yang sedikit berbeda.

Saya pada dasarnya melihat kami harus menulis skrip inventaris dan kemudian hanya mendorong semua data kami ke dalam beberapa basis data yang dibuat untuk tujuan dan kemudian terus berjalan seolah-olah tidak ada yang berubah. Saya melihat ini sebagai cara untuk mengurangi banyak data yang saat ini kami simpan dan mungkin mencari cara-cara yang berbeda untuk menyimpan data, bukan hanya meningkatkan apa yang berfungsi lagi.

Saya berharap seseorang memiliki semacam pengalaman dalam mengimplementasikan infrastruktur sebagai kode ketika harus berurusan dengan banyak lingkungan yang lebih kecil dibandingkan dengan satu, dua atau tiga yang besar.

Ada saran?

Naphta
sumber

Jawaban:

13

Saya sudah dua kali menjalankan variabel lingkungan dengan cara scalable dan tidak ada yang berakhir sempurna karena, seperti yang saya temukan, adalah hal yang sangat sulit untuk dilakukan dengan benar. Saya akan memberikan ringkasan dari kedua pengalaman saya di bawah ini:

Faktor umum

  • Variabel lingkungan disimpan dalam repositori terpisah dari kode sumber asli (mereka didaftarkan bersama tetapi masih didasarkan pada repositori terpisah)
  • Ada proses "build" yang terpisah untuk artefak dan variabel-variabelnya.
  • Ada tidak proses rilis terpisah untuk variabel lingkungan. Jika Anda ingin mengubah variabel lingkungan, Anda harus melalui papan peninjauan perubahan yang sama dan biasa

Menggunakan Konsul KV Pasangan

Variabel lingkungan dimuat dari repositori artefak (tidak pernah repo git asli) dan dimuat ke pohon pasangan KV namespaced, misalnya

/env/dev1/my/aplikasi/v1.1.1

Di mana dev1 sebelumnya adalah nama lingkungan, aplikasi / saya adalah namespace aplikasi, dan v1.1.1 adalah versi variabel lingkungan untuk digunakan.

Untuk pengembang semua hal ini tidak terlihat. Pada saat runtime, platform memeriksa bahwa lingkungan ada dalam cluster konsul saat ini (jika tidak ada masalah dan kesalahan keluar), maka ia akan memeriksa subtree untuk namespace aplikasi (dengan cara ini tidak ada kontaminasi silang di mana satu aplikasi referensi aplikasi lain vars) maka nomor versi konfigurasi diambil dari label yang terhubung ke artifact yang dapat digunakan. Memperbarui label ini adalah hal utama di sini karena itu berarti jika kami kehilangan kedua pusat data produksi, kami dapat mempertahankan lingkungan lagi dengan sederhana membaca data meta dari artefak yang dapat digunakan dan memuat semua variabel lingkungan ke dalam toko KV.

Masalah dengan Pendekatan Ini Pengembang selalu, dan maksud saya setiap saat, menemukan cara untuk menyelipkan perubahan konfigurasi ke lingkungan yang memiliki dampak signifikan terhadap bagaimana aplikasi akan berjalan. Karena selalu lebih mudah untuk mendapatkan perubahan konfigurasi yang disetujui daripada perubahan kode.

Menyimpan Artifact "Deployment" dengan variabel yang disematkan

Ini dengan erat memasangkan versi artefak yang tepat dengan versi konfigurasi. Jika Anda mengubah konfigurasi maka Anda harus membangun kembali artefak penyebaran ini.

Artefak penyebaran itu sendiri pada dasarnya adalah file yaml yang berisi URL ke biner yang dapat dirilis dan semua konfigurasi yang dilampirkan padanya.

Platform berisi komponen untuk membaca variabel dan kemudian keluar ke pohon proses aplikasi saat dijalankan.

Sejauh ini, ini jauh lebih berhasil karena ada artefak yang dapat kita telusuri sejarahnya dan yang bisa kita pertahankan hingga papan ulasan dan katakan "ini satu-satunya artefak yang kita pedulikan, kita tidak perlu melihat perubahan lain, hanya perubahan pada hal ini "(mis. Versi aplikasi untuk digunakan, variabel lingkungan disertakan dll.

Ini membuatnya sedikit lebih sulit bagi pengembang untuk mencoba dan membangun logika ke dalam aplikasi mereka yang akan mengubah perilakunya berdasarkan variabel sehingga mereka dapat menyelipkan perubahan tanpa melalui siklus pengujian yang sesuai.

Poin Bonus

Pertimbangkan rahasia aplikasi. Solusi kami sejauh ini adalah menyediakan kunci RSA publik yang digunakan tim pengembangan untuk mengenkripsi penyimpanan kunci Java yang diperluas (hampir setiap bahasa memiliki perpustakaan di suatu tempat yang dapat membaca toko kunci Jawa) ini kemudian diperlakukan seperti jenis artefak ketiga dan ditarik ke server, didekripsi dengan kunci pribadi platform kami, dan disediakan untuk aplikasi pada saat dijalankan.

Harus diakui manajemen rahasia adalah kaleng cacingnya sendiri. Tapi mungkin patut dipertimbangkan.

hvindin
sumber
2
Rahasia aplikasi, saya akan menyarankan untuk melihat Vault ( vaultproject.io ) karena juga merupakan bagian dari toolchain Hashicorp dan terintegrasi agak rapi dengan Konsul (dan alat-alat lain dari kotak itu)
Michael Bravo
Aku sebenarnya sangat underwhelmed oleh lemari besi mengingat betapa hebatnya hashicorp biasanya. Pada dasarnya tiga celah utama dalam produk mereka vs sisa pasar - 1. 'Rahasia untuk rahasia' pada dasarnya adalah apa yang membuat model turun. Saya mendapatkan sharding atau menggunakan HSM. Tapi intinya itu hanya perdagangan rahasia. 2. Kompatibilitas alat, tidak seperti alat lainnya, tidak ada dukungan untuk plugin 3. Harga. Saya tidak mempercayainya ketika memberi tahu perusahaan saya bahwa lemari besi berharga mahal. Mereka menolak produk karena terlalu murah, ini kacau. Tetapi lemari besi sangat banyak sehingga mereka bahkan tidak mempertimbangkannya.
hvindin
Perlu dicatat bahwa itu hanya mahal jika Anda menggunakan versi berbayar . Produk inti Vault adalah open-source. Tentu saja mereka tidak mencantumkan harga untuk versi pro / perusahaan di situs mereka, jadi saya tidak tahu seberapa masuk akal untuk edisi-edisi tersebut.
Adrian
Hm, saya tidak melihat bahwa kelalaian dari komentar saya, meskipun harus adil dua masalah pertama saya dengan lemari besi masih berdiri. Meskipun, untuk memenuhi syarat, itu adalah pemikiran saya tentang lemari besi dibandingkan dengan produk hashicorp lainnya, yang semuanya menurut saya cukup hebat. Dibandingkan dengan produk lain di pasaran, melakukan fungsi serupa mungkin setara, hanya untuk beberapa alasan jauh lebih mahal dari yang diharapkan.
hvindin
Bisakah Anda memberikan contoh "membangun logika ke dalam aplikasi mereka yang akan mengubah perilakunya berdasarkan variabel sehingga mereka dapat menyelipkan perubahan tanpa melalui siklus pengujian yang sesuai."? Kedengarannya seperti sesuatu yang sangat umum, tetapi saya tidak dapat membayangkan contoh nyata.
kenchew
3

Jika lingkungan Anda adalah per pelanggan, dalam kasus spesifik Anda disarankan untuk memiliki repositori per pelanggan . (Secara umum ini adalah repositori per lingkungan.) Repositori ini akan memiliki struktur direktori standar untuk variabel lingkungan, variabel yang mungkin dan inventaris, rahasia yang sangat terenkripsi (token akses akun, kunci pribadi, dll.). Anda akan mengirimkan kode tersebut ke dalam repositori tersebut. Saya mungkin akan melakukannya dalam beberapa repositori. Satu untuk peran dan modul yang mungkin, satu untuk skrip pemeliharaan dan penerapan, satu untuk setiap aplikasi utama yang berjalan di lingkungan.

Sekarang Anda secara opsional dapat benar-benar memotong kode atau menyematkan submodule pada tag spesifik untuk rilis , memastikan bahwa kode yang mengelola lingkungan pelanggan tidak akan berubah kecuali diuji dan dirilis.

Jika Anda menggunakan repositori artefak , pastikan artefak diversi dengan benar dan versi tersebut ditentukan dalam variabel lingkungan dengan benar.

Otomatisasi penting karena variabel lingkungan tidak boleh diperbarui oleh manusia jika memungkinkan, tetapi dihasilkan oleh skrip. Pastikan bahwa hampir tidak ada pembaruan manual dalam inventaris per pelanggan dan pengembang hanya memperbarui repositori kode. Jika mereka ingin membuat perubahan konfigurasi, itu harus dilakukan ke salah satu skrip penghasil, yang kemudian dijalankan untuk menghasilkan variabel dan diff dikomit ke dalam repositori pelanggan. Membayar untuk mengatur integrasi berkelanjutan untuk proses ini. Tanpa ini pada beberapa titik akan ada terlalu banyak repositori untuk dipelihara .

Jiri Klouda
sumber
Hanya satu keberatan: rahasia tidak boleh masuk ke repositori kontrol versi kecuali ia memiliki dukungan kontrol akses yang ketat. Git tidak - siapa pun yang menarik repositori dapat melihat rahasia, yang bisa menjadi masalah - mereka bukan lagi rahasia.
Dan Cornilescu
Tangkapan yang bagus. Itu adalah rahasia terenkripsi. Kunci dekripsi tramsien.
Jiri Klouda