Ortam değişkenlerimi nasıl saklamalıyım?


11

Bu, ortam değişkenleri / yapısı ile ilgili yöntemler ve tavsiyeler hakkında çok geniş bir sorudur. Ama sonuçta 'Ortam değişkenlerimi nasıl saklamalıyım?' Sorusunun cevabını arıyorum.

Öncelikle bazı açıklamalar:

  • Benim için bir ortam 3 ila 10 sunucu olabilir ve belirli bir müşterinin altyapısını içermenin bir yoludur.
  • Her ortamın içinde, çoğunlukla birkaç tuş girişinden (ad, boyut vb.) Otomatik olarak üretilen birkaç değişken vardır.

Şu anda olduğu gibi tüm çevre değişkenlerimizi şöyle bir yapıda saklıyoruz:

<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 

Şu anda yapılandırma yukarıdaki git deposunda bir alt modül olarak başlatıldı. Değişkenler dosyası oldukça sık değiştiğinden, bu, verilerin değişmesiyle ilgili sorunlara neden olmuştur, değişiklikler arasında izleri gittikçe zorlaştıran bir kez, iki veya üç kez.

Şahsen ilerlediğini gördüğüm gibi, tüm müşteri değişkenlerimizi merkezi / ölçeklenebilir bir şekilde ve daha sonra ile dinamik bir envantere .

Konsül gibi gerekebilecek bir parçayı yapıyor gibi görünen birkaç teknoloji olduğunu anlıyorum, ancak çok daha küçük farklılıklar yerine çok büyük bir uygulamaya hizmet eden bir ortamda en iyi şekilde çalışıyor gibi görünüyorlar.

Temelde bize bir envanter betiği yazmak ve sonra sadece tüm amaç dışı inşa edilmiş veritabanına tüm verilerimizi kıpırdamak ve sonra hiçbir şey değişmiş gibi devam etmek zorunda görmek. Bunu, şu anda sakladığımız birçok veriyi potansiyel olarak kısaltmanın bir yolu olarak görüyorum ve belki de tekrar tekrar neyin hizmet verdiğini ölçeklendirmek yerine verileri depolamanın farklı yollarına bakıyorum.

Birinin, bir, iki veya üç büyük olanın aksine daha küçük ortamlarla uğraşmak zorunda kalırken, altyapıyı kod olarak uygulamada bir tür deneyime sahip olmasını umuyorum.

Herhangi bir öneri?

Yanıtlar:


13

Çevre değişkenlerini ölçeklenebilir bir şekilde yapmak için iki çalıştım ve ikisi de mükemmel sonuçlanmadı, çünkü keşfettiğim gibi, doğru olmak çok zor bir şey. Her iki deneyimin bir özetini aşağıda vereceğim:

Ortak etkenler

  • Ortam değişkenleri orijinal kaynak kodundan ayrı bir depoda saklanır (bunlar birlikte alt modüle edilir ancak yine de ayrı depolara dayanır)
  • Artefakt ve değişkenleri için ayrı bir "oluşturma" işlemi vardır.
  • Orada değil ortam değişkenleri için ayrı bırakma süreci. Ortam değişkenlerini değiştirmek istiyorsanız, aynı değişiklik gözden geçirme panolarından geçmeniz gerekir.

Consul KV Çiftlerini Kullanma

Ortam değişkenleri bir yapay veri havuzundan (asla orijinal git repo'su) yüklenir ve örneğin bir ad boşluklu KV çift ağacına yüklenir

/env/dev1/my/application/v1.1.1

Önceki dev1 ortamın adı olduğunda, benim / uygulamam uygulama ad alanı ve v1.1.1 kullanılacak ortam değişkenlerinin sürümüdür.

Geliştiriciler için tüm bunlar görünmezdir. Çalışma zamanında platform, geçerli konsül kümesinde ortamın var olup olmadığını kontrol eder (bir sorun yoksa ve hatalar çıkarsa), daha sonra uygulama ad alanı için alt ağacı kontrol eder (bu şekilde bir uygulamanın çapraz kontaminasyonu olamaz başka bir uygulamaya göre değişir), yapılandırmanın sürüm numarası konuşlandırılabilir yapıya bağlı etiketten alınır. Bu etiketin güncellenmesi burada önemli olan şeydir, çünkü her iki üretim veri merkezini de kaybedersek, konuşlandırılabilir eserlerden meta verileri basitçe okuyarak ve tüm ortam değişkenlerini KV deposuna yükleyerek çevreyi tekrar ayağa kaldırabiliriz .

Bu Yaklaşımla İlgili Sorunlar Geliştiriciler her zaman, yani her seferinde, uygulamanın nasıl çalışacağı üzerinde önemli etkileri olan yapılandırma değişikliklerini çevreye kaydırmanın bir yolunu buldular. Çünkü yapılandırma değişikliklerinin onaylanmasını her zaman kod değişikliklerinden daha kolay hale getirdi.

Değişkenleri gömülü olarak bir "Dağıtım" Yapısını depolama

Bu, yapay nesnenin tam sürümünü yapılandırma sürümüyle sıkıca birleştirir. Yapılandırmayı değiştirdiyseniz, bu dağıtım yapısını yeniden oluşturmanız gerekiyordu.

Konuşlandırma yapısının kendisi, temel olarak, serbest bırakılabilir ikili dosyaya ilişkin URL'yi ve ona eklenen tüm yapılandırmayı içeren bir yaml dosyasıydı.

Platform, değişkenleri okumak ve daha sonra başlatıldığında bunları uygulamanın işlem ağacına göndermek için bileşen içerir.

Bu şimdiye kadar çok daha başarılı oldu, çünkü tarihini izleyebileceğimiz ve herhangi bir inceleme kuruluna dayanabileceğimiz ve "önemsediğimiz tek eser bu, bakmamıza gerek yok. diğer değişiklikler, yalnızca bu öğedeki değişiklikler "(ör. Dağıtılacak uygulamanın sürümü, ortam değişkenleri dahil vb.)

Bu, geliştiricilerin uygulamalarına, uygun test döngülerinden geçmeden değişikliklere kayabilmeleri için davranışlarını değişkenlere göre değiştirecek mantığı oluşturmaya çalışmasını biraz zorlaştırır.

Bonus puanlar

Uygulama sırlarını düşünün. Buna şimdiye kadarki çözümümüz, geliştirme ekiplerinin genişletilmiş bir Java anahtar deposunu şifrelemek için kullandıkları genel bir RSA anahtarı sağlamaktı (neredeyse her dilde, Java anahtar mağazalarını okuyabilen bir yerde bir kütüphane var), bu daha sonra üçüncü bir yapı türü olarak ele alınır. sunucuya çekilir, platform özel anahtarımızla şifresi çözülür ve çalışma zamanında uygulamaya sunulur.

Kuşkusuz sır yönetimi kendi solucan kutucuğudur. Ama muhtemelen dikkate almaya değer.


2
Re: uygulama sırları, Ben de Hashicorp araç zincirinin bir parçası olduğu ve Consul (ve bu kutudaki diğer araçlar) ile düzgünce entegre olduğu Vault ( vaultproject.io ) bir göz atmanızı öneririm
Michael Bravo

Gerçekten hashicorp şeyler ne kadar büyük olduğu göz önüne alındığında, tonoz tarafından çok underwhelmed. Esasen ürünlerinde pazarın geri kalanına karşı üç büyük boşluk var - 1. 'Sırlar için Sırlar' modelin temelini oluşturuyor. Parçalanıyorum veya HSM kullanıyorum. Ama aslında sadece sır ticareti. 2. Araç uyumluluğu, diğer araçların aksine eklentiler için destek yoktur 3. Fiyat. Şirkete düşünce kasamın pahalı olduğunu söylediğimde inanmadım. Ürünleri çok ucuz oldukları için reddetti, berbat. Ama tonoz o kadar fazlaydı ki, bunu düşünmediler bile.
hvindin

Ücretli bir sürüm kullanıyorsanız sadece maliyet engelleyici olduğunu belirtmek gerekir . Apps Kasası'nın temel ürünü açık kaynaklıdır. Tabii ki kendi sitelerinde pro / kurumsal sürümleri için fiyatlandırma listelemez, bu yüzden bu sürümler için ne kadar makul olabilir hiçbir fikrim yok.
Adrian

Hm, yorumumdan çıkarıldığımı fark etmedim, ancak adil olmak gerekirse tonozla ilgili ilk iki problemim hala duruyor. Her ne kadar hak kazanmak için, bunlar, hepsi oldukça harika olduğunu düşündüğüm diğer hashicorp ürünlerine kıyasla kasa hakkındaki düşüncelerim. Piyasadaki diğer ürünlerle karşılaştırıldığında, benzer bir işlevi gerçekleştirmek muhtemelen eşittir, sadece bir nedenden dolayı beklenenden çok daha pahalıdır.
hvindin

"Uygulamalarına, uygun test döngülerinden geçmeden değişikliklerde kayabilmeleri için değişkenlerine göre davranışını değiştirecek mantık oluşturma" örneği verebilir misiniz? Çok yaygın bir şey gibi geliyor ama somut bir örnek düşünemiyorum.
kenchew

3

Ortamlarınız müşteri başına ise, özel durumunuzda müşteri başına bir havuz olmasını öneririm . (Genel olarak ortam başına havuzdur.) Bu havuz, ortam değişkenleri, ansible değişkenler ve envanterler, güçlü şekilde şifrelenmiş sırlar (hesap erişim belirteçleri, özel anahtarlar vb.) İçin standart bir dizin yapısına sahip olacaktır. Kodu bu depoların alt modülüne gitmiş olursunuz. Muhtemelen birden fazla depoda yapardım. Biri ansible roller ve modüller için, biri bakım ve dağıtım komut dosyaları için, biri ortamlarda çalışan her büyük uygulama için.

Artık isteğe bağlı olarak kodu çatallayabilir veya alt modülü serbest bırakılmak üzere belirli bir etikete sabitleyebilirsiniz , böylece test edilip serbest bırakılmadığı sürece müşterinin ortamını yöneten kodun değişmeyeceğinden emin olabilirsiniz.

Artefakt deposu kullanıyorsanız , artefaktların düzgün bir şekilde sürümlendirildiğinden ve bu sürümlerin ortam değişkenlerinde doğru bir şekilde belirtildiğinden emin olun.

Otomasyon önemlidir, çünkü ortam değişkenleri mümkün olduğunda insanlar tarafından güncellenmemeli, senaryolar tarafından oluşturulmalıdır. Müşteri başına envanterde neredeyse hiç manuel güncelleme olmadığından ve geliştiricilerin yalnızca kod depolarını güncellediğinden emin olun. Konfigürasyon değişikliği yapmak istiyorlarsa, o zaman değişkenleri oluşturmak için çalıştırılan ve fark müşteri deposuna işlenen komut dosyası oluşturma komutlarından birine yapılmalıdır. Bu süreç için sürekli entegrasyon kurmayı öder. Bu olmadan bir noktada bakımını yapmak için çok fazla depo olacaktır .


Sadece bir itiraz: sırlar, sıkı erişim kontrolü desteğine sahip olmadıkça bir sürüm kontrol havuzuna girmemelidir. Git - depoyu çeken her kim sırları görebiliyor ki bu bir sorun olabilir - artık sır değiller.
Dan Cornilescu

İyi yakalama. Şifrelenmiş sırlardır. Şifre çözme anahtarları tramsient.
Jiri Klouda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.