Kod ve TDD olarak altyapı


11

Kod olarak altyapı, yapılarınızı otomatikleştiren araçları kullanmamızı söyler. Harika. Ansible , chef , kukla , tuz yığını ve diğerleri gibi araçlar bizi farklılıkları çözerken altyapının nasıl göründüğünü yazmaya doğru itiyor.

Tuz Yığını'nda bu bitlere durum denir . Eğer durum gerçeklikle uyuşmuyorsa, araç bunu bizim için çözecektir. Başka bir deyişle - altyapımız için bir test yazıyoruz ve test başarısız olursa, araç bunu kendi başına düzeltir. En azından fikir bu.

XP bize TDD'yi kullanmayı öğretiyor ve soru altyapıya uygulanabilir mi? Takım öyle olduğunu gösteriyor.

Çok yararlı olabilecek birkaç tür test hayal edebiliyorum.

Konuşlandırılan hizmetin uçtan uca beklendiği gibi çalıştığından ve çalıştığından emin olmak için konuşlandırılmış hizmetle birlikte verilen duman testleri yazıyoruz. Bu, dağıttığımız şeyin işe yaradığından emin olmak için bir API çağrısı veya / ve systemctl kontrolü olacaktır. Ansible gibi araçların bir hizmetin çalıştığından emin olmak için durumları olduğundan bu işlevselliklerin çoğu aynı durumlarda ele alınabilir.

Liman işçisine veya başka bir geçici sanallaştırma motoruna karşı bireysel rollerin (durumlarını sesli olarak çağırdığı gibi) çalıştırmaya izin veren Molekül projesi vardır . Bu, rolleri ayırmaya zorlar ve üzerinde çalışırken oyun kitabından ayrı olarak yürütülmelerine izin verir. Testler çoğunlukla rolün çalışması gereken değişkenlerin alay edilmesine izin verir. Diğer örnekler, ansible motorun bir kopyası gibi görünmektedir (bir dosyanın bir kullanıcıya ait olduğunu iddia edin ...).

ThoughtWorks teknoloji radarı şu anda sunucunun teknik özellikleri karşıladığını doğrulamak için inspec , serverspec veya goss gibi araçları övüyor . Ama bir özellik yazıyoruz, değil mi?

Peki, eyaletlerde / rollerdeki altyapıyı açıklıyorsak, altyapıyı daha fazla test etmenin bir anlamı var mı? Bunun, bir takımın spesifikasyonu ve diğerlerini sağladığı daha büyük organizasyonlarda daha gerekli hale gelebileceğinden şüphelenebilirim ya da çok sayıda rol varsa, belki de bunların bir alt kümesini çalıştırmak ve testlerden hızlı bir şekilde yararlanmak istersiniz? Akılda aynı soru için bir rol / durumunuz varsa neden bir test yazacağınızı görmek için uğraşıyorum.

Yanıtlar:


6

Kısacası, altyapınız için iki test kategorisi görüyorum: 1) uygulamanızı çalıştırmak için ihtiyacınız olan her şeye sahip mi ve 2) gereksiz herhangi bir şey içermiyor mu?

Her şeyden önce, gerçek yazılımınızın test paketini altyapınız için bir tür "meta test" olarak değerlendirebilirsiniz. Her test çalıştırması için altyapıyı sıfırdan oluşturduğunuz ve test paketi tamamen bu altyapı üzerinde çalıştığı sürece (yani, dış hizmetleri kullanmıyorsa) tüm paketin yeşil olması, kodlanmış altyapınızın da yeterli olduğu anlamına gelir .

İkincisi, özellikle güvenlik açısından, altyapınıza karşı testler yazabilirsiniz. Yani, altyapınızın bir kısmı Linux çalıştıran bir VM ise, istenmeyen bir apt-get installyan etki tarafından yüklenmiş olabilecek istenmeyen bağlantı noktalarının olmadığından emin olmak için o VM'ye karşı bir bağlantı noktası taraması yapan bir test yazabilirsiniz. . Veya uygun test paketiniz tamamlandıktan sonra beklenmedik dosyaların değiştirilip değiştirilmediğini kontrol eden testler yazabilirsiniz. Veya psVM'lerinizin veya Docker kaplarınızın çıktılarını beklenmedik süreçler ve benzeri şeyler için kontrol edebilir , beyaz listeler vb. Oluşturabilir ve bu nedenle bazı üçüncü taraf paketlerinin bazı yükseltmelerde belgelenmemiş (veya fark edilmeden) bir şekilde değişmesi durumunda otomatik bildirim alabilirsiniz.

Bu ikinci tür testler, bir şekilde, yine de klasik bir ops ayarında yaptıklarınıza benzer, yani sunucularınızı sertleştirmek ve izinsiz girişleri kontrol etmek, tam kaynak ve benzeri şeylerden kaçınmak.


Bu yüzden bir süre sonra, bu benim tam olarak benim duruşum. Ansible tarafından yürütülen parçalar tek başına test edilmez, ancak bu eylemlerin yan etkileri kullanılarak test edilir goss. Bu nedenle, örneğin, RPM yüklenir (ansible) ve daha sonra beklenen varsayılan dosya yerleştirilirse veya hizmet belirli bir bağlantı noktasını çalıştırıyor ve dinliyorsa test edilir. Bu sorunu otomatik olarak düzeltmek istemiyorum, ancak haberdar edilmek ve ilerlemeyi durdurmak istiyorum. Elbette Ansible sistemi sizin için de test edebilir, sadece açık olmanız gerekir, ancak bizim durumumuzda, gossbir kap içindeki hizmet davranışını test etmek için kullanırız
JackLeo

1

IMHO, tamamen IaaC durum spesifikasyonu kapsamında olan öğeler için TDD testleri yazmak oldukça gereksizdir. Bunu yapmak, IaaC'nin etkinliğinin sorgulanabilir olduğunu ima eder - neden öyleyse kullanasınız?

Farklı bir olası IaaC'nin kendisinden bakmak (eğer doğru şekilde yapılırsa / uygunsa) zaten test edilmiş ve güvenilir şekilde çalıştığı düşünülen yetenekleri içerir. Bunu çekici kılan ve TDD eşleştirme testlerini yazmayı gereksiz yapan da budur.

Örneğin, SSH'nin kurulu olduğu bir sistemi belirten bir IaaC yapılandırması, SSH'nin doğru bir şekilde kurulduğunu güvenilir bir şekilde kontrol eder ve eğer değilse, doğru bir şekilde kurmak için mekanizmalar içerir. SSH'nin yedekli olup olmadığını kontrol etmek için bir TDD testi yapar. IaaC yapılandırmanız ayrıca başlatılacak ve belirli bir bağlantı noktasını dinleyecekse sshd'yi belirtirse, ilgili bağlantı noktasını sshd çalışması ve dinlemesi için TDD testleri de gereksiz olur.

Cevabımın TDD'yi veya IaaC yapılandırmanızın bir bütün olarak belirli bir amaca uyup uymadığını kontrol eden başka bir test türünü hedeflemediğini unutmayın. Bu geçerliliğini korur ve bu IaaC spesifikasyonunun geliştirilmesi sırasında TDD, CI veya benzeri kontrollerde kullanılabilir - Bu durumda @ AnoE'nin cevabının uygulanabilir olduğuna inanıyorum.


Harici bir yapılandırma dosyasından ayrıştırılan belirli bir özel bağlantı noktasında SSH'nin (veya herhangi bir şeyin) etkinleştirildiğinden emin olmak için aynı düşünceyi uyguluyor musunuz? Bu test edilmiş birimlere dayanmıyor, yeni bir mantık.
Jon Lauridsen

1
Destekliyorsa, IaaC'nin bir parçası olmalıdır. Değilse - bu tartışma gerçekten geçerli değildir. Evet, bu IaaC'nin ne kadarını kapsayabileceğine kayabilir, ancak bu farklı bir tartışmadır.
Dan Cornilescu

1
Ayrıca gereksiz denetimlerin gerekli olduğu bir bağlamda olmadığımızı varsayıyorum - bazı durumlarda tamamen farklı kod yollarını veya hatta altyapıyı takip eden gereksiz denetimler.
Dan Cornilescu

1

Buradaki herkesin bir IAC aracının her zaman beklendiği gibi çalıştığını varsaydığı anlaşılıyor, ancak (kendi tecrübelerimden) bunun her zaman böyle olmadığını söyleyebilirim, aksi takdirde birim testi aslında işe yaramaz.

Arka planda yanan bir bina ile "Ansible playbook koştu, her şey yolunda" diyen bir resim hatırlıyorum ...

Bildirici bir durum çalıştırmak ve sunucunun bu gerçek bildirilen durumda olması en azından benim bakış açım ve deneyimimden 2 farklı şeydir.

Birden fazla DC'ye yayılmış, kamu ağı vb. Yoluyla erişilebilen geniş ve heterojen bir ortam ... Bir devletin tamamen veya kısmen uygulanamamasının birden fazla nedeni vardır.

Tüm bu nedenlerden dolayı, gerçek sunucu durumunun anlık görüntüsünü almasına izin veren birim test için yer vardır, bu da yine amaçlanan durumdan farklı olabilir.

Evet diyorum, birim testi IAC tarafından yönetilen bir ortamda bile yararlıdır.

DÜZENLE

IaC kod tabanının geliştirici dalının regresyon dışı tarafı ne olacak? yani dev dalındaki kodunuzda değişiklik yapar ve her şeyi kırmamak umuduyla eşya dalıyla birleştirir misiniz? birim testi çok değerlidir ve uygulanması kolaydır, bu özellik olmadan neden kodlama yapacağımı görmüyorum.

Referans (bunun için Fransızca üzgünüm): https://fr.slideshare.net/logilab/testinfra-pyconfr-2017


1
En azından aşağı oyla yorum eklemek kibar olurdu, aşağı seçmen değil mi? Özellikle tartışmanın çok bilgilendirici ve hatta yapıcı olabileceği bu tür bir soru üzerine.
Pier

Bu soru ile etkileşime giren herkese oldukça agresif olan cevabınızın tonunu, kendi örnekleminizden herhangi bir referans vermediğinize veya gözlemlenen herhangi bir arızayı tanımlayana inen vekilin sebebi olduğunu ekledim. Sonunda, diğer cevapların söylediği aynı şeyi söyleyerek bitiriyorsunuz, sistemin iyi olduğundan emin olmak için tedarik sisteminizde duman testleri yapın, çoğu sistem sistemi istenen durumda birleştiremezlerse başarısız olur. Düzenlemenizle ilgili olarak, genellikle birleştirme, evrelemeye yerleştirildikten ve duman testlerinin geçmesini
sağladıktan

Kesinlikle agresif olmaya niyetim yoktu, burada doğal dilimi kullanmıyorum (sanırım bu açıktır :)).
Pier

İsterseniz DevOps Sohbeti'nde tartışabiliriz , sanırım bu sunumu veya benzer bir sunumunu birkaç yıl önce bir devoxx etkinliğinde gördüm. Bu birim testi çağırmaya biraz katılmıyorum, bu daha işlevsel testler.
18'de Tensibai

Benim dev ekibinden bazı biri bu birim testi çağırarak hakkında yanlış olabilir bu yüzden kesinlikle hiçbir dev değilim, bu birim test değildi bana çok aynı anlattı
İskele

1

Deneyimlerime göre Dev ve Ops arasındaki temel farklardan biri "ağır çalışma süresi bağımlılıkları" dır. Paketlerin yüklenmesi büyük ölçüde depolara, ağlara veya geçerli anahtarlara bağlıdır veya yeni bir bulut sunucusunu başlatmayı söyleyelim - bu sağlayıcı kaynaklarınıza bağlıdır.

Sunucu provizyonu açısından, provizyon kodunuzu değiştirmeseniz bile, resminiz çoğu zaman geçerli olur, ancak bazen geçerli olmaz. Bu yüzden test çalışma görüntüleri sağlamak için gerçekten gerekli olduğunu düşünüyorum.

Tek sunucularda giderseniz işler daha da kötüleşir ... tüm ağ kurulumlarında erişilebilirliği nasıl test edersiniz? DNS çözümlemesi, yönlendirme ve güvenlik duvarı dahil mi? IaaC sağlayıcıları API'nız beklendiği gibi çalışsa bile (bu alanda kablolu sorunlar gördüm) bu durumda TDD'yi gerçekten seviyorum.

Bu alanda herhangi bir test aracı bulamadığımız için boş zamanımızda bir tane yazdık: https://github.com/DomainDrivenArchitecture/dda-serverspec-crate

Bu yüzden TDD'nin DevOps dünyasında gerçekten önemli olduğunu düşünüyorum!

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.