Ansible'ın Vagrant'da basitçe bir prova bash kabuğu çalıştırmasından farkı nedir?


38

Sorunlarını çözmek için kabuk komut dosyası kullanarak deneyime sahip bir IT sistem yöneticileri ekibi, bunun yerine Ansible kullanmaya başlamayı düşünüyor.

Kabuk komut dosyaları yazmaya devam etmek için Ansible'ı kullanmaya başlamak için önemli farklılıklar ve iyi nedenler var mı?

Yanıtlar:


29

Ansible'ı hiç kullanmadım ama birkaç haftadan beri, Ansible'ın kabuk komut dosyalarına kıyasla ne kadar iyi olabileceğini anlamaya çalışıyorum. Bu, en azından benim durumumda, akıl almaz reklam kampanyalarının etkili olduğunu kanıtladı! Birçok başarısız denemeden sonra - ki bu, belgelerinin en açık soruyu cevaplamada nasıl başarısız olduğunu kanıtladı - sanırım sonunda:

Şimdi tanıtım videosunu izleyelim ve potansiyel olarak yeni bir kullanıcı olarak Ansible ans tanıtım materyali üzerinden rastgele gidelim. Bunu, yetenekli bir kabuk programcısının hemen raftan ne üretebileceği ile karşılaştıralım.

Sonucum, kabuk komut yazması üzerine Ansible'ın temelde 1 olduğunu söylüyor: Bir sistemin istenen bir durumu kabul ettiğini kontrol etme imkanı, 2. İzleme yeteneklerini içeren bir ödeme sistemi olan Ansible Tower ile entegrasyon yeteneği. Bazı önemli durumlarda, değişmez sunucu modelini uygularken olduğu gibi, nokta 1 muhtemelen çok kullanışlı değildir, bu yüzden liste oldukça zayıftır.

Sonuç olarak, Ansible tarafından kabuk betiğine göre sunulan faydaların, belgelerin sunulduğu haliyle, mevcut modüller tarafından iyi ele alınan birkaç avuç iyimser vaka için mantıklı olabileceği, ancak genel vaka için küçük veya hatta varsayımsal olabileceğidir. Muhtemelen yetenekli bir kabuk programcısı için, bu avantajlar büyük olasılıkla takasın diğer yönleriyle dengelenir.

Ancak bu belki tanıtım malzemesinin ne kadar kötü olduğunu kanıtlar!

Hızlı başlangıç ​​videosu:

Bir yoktur hızlı başlangıç Video . Şunu iddia eden bir sayfa ile başlar: bunlar gerçekten iddia değil, bunlar madde listeleridir, sunumlarda eleştirel yargıları askıya almak için yaygın olarak kullanılan bir eserdir (mantık gösterilmediğinden, eleştirilemez!).

1. Ansible basittir:

1.1 İnsan tarafından okunabilir otomasyon - Teknik özellikler teknik belgelerdir, nasıl olabilir?

  name: upgrade all packages
  yum:
    name: '*'
    state: latest

Bir kabuk betiğinde bulunan ilgili yum çağrısından daha kolay okunabilir mi? Ayrıca, AppleScript ile teması olan herhangi biri, “insan tarafından okunabilir otomasyon” okuduğunda gülmekten ölür.

1.2 Özel bir kodlama becerisine gerek yok - Resmi spesifikasyonlar yazmıyorsa kodlama nedir? Şartlıları, değişkenleri var, kodlama nasıl değil? Ve neden programlayamayacağım, dolayısıyla esnek olamayacak bir şeye ihtiyacım olsun ki? Açıklama mutlu bir şekilde yanlış!

1.3 Düzenli olarak yürütülen görevler - Pekala, belki bazı kodlayıcı meraklıları düzensizlikleri yerine getiren dilleri bilirler , ancak sırayla görevlerini yerine getirmeleri olağanüstü görünmez .

1.4 Hızlı bir şekilde üretken olun - Nitelikli kabuk programcıları şimdi üretkendir. Bu karşı-argüman ilk argüman kadar ciddi.

2. Ansible güçlüdür

Eserleri satmak için popüler bir satıcı hilesi, insanları bu eserlerin “gücünü” kazanacaklarına inanmaya kandırmaktır. Otomobiller veya izotonik içecekler için reklam tarihçesinde ikna edici örnekler verilmelidir.

Burada Ansible “uygulama dağıtımı” yapabilir - ancak kabuk betiği kesinlikle “yapılandırma yönetimi” yapar, ancak bu, bir özellik değil aracın amacına ilişkin bir ifadedir ve biraz iddialı görünen, ancak hiçbir işe yaramayan “iş akışı düzenleme” dir. GNU Parallel’in yapabileceklerinin ötesinde .

3. Ansible acentasızdır

Sütunu doldurmak için, üç farklı şekilde, bunun sadece ssh'ye ihtiyaç duyduğunu yazdılar , çünkü herkesin bir servet olduğunu ve bu ajanların dünya konfigürasyon yönetimini çevreleyen ile ilgisi olmadığını söyledi !

Videonun geri kalanı

Videonun geri kalanı, statik kaynak listeleri (sunucular gibi) olan ve Apache'nin aynı anda üç sunucuya nasıl dağıtılacağını gösteren envanterleri tanıtıyor. Bu gerçekten benim çalışma biçimime uymuyor, kaynakların oldukça dinamik olduğu ve bulut sağlayıcım tarafından sağlanan komut satırı araçlarıyla numaralandırılabildiği ve boru |operatörü kullanılarak kabuk işlevlerimin tükettiği şekilde uyuşmuyor . Ayrıca, Apache'yi aynı anda üç sunucuya dağıtmıyorum, bunun yerine, diğerlerinden birinin tam kopyaları olan 3 örneği başlatmak için kullandığım bir ana örnek görüntüsü oluşturuyorum. Dolayısıyla tartışmanın “düzenleyici” kısmı pek uygun görünmüyor.

Rastgele dokümantasyon adım 1: EC2 ile entegrasyon

EC2, Amazon'un bilgi işlem servisidir ve onunla etkileşime girerek bazı Ansible modülleri tarafından desteklenmektedir . (Diğer popüler bulut bilişim sağlayıcıları da sağlanmıştır):

# demo_setup.yml

- hosts: localhost
  connection: local
  gather_facts: False

  tasks:

    - name: Provision a set of instances
      ec2:
         key_name: my_key
         group: test
         instance_type: t2.micro
         image: "{{ ami_id }}"
         wait: true
         exact_count: 5
         count_tag:
            Name: Demo
         instance_tags:
            Name: Demo
      register: ec2

Karşılık gelen kabuk betiği JSON ile değiştirilen YAML ile temelde aynı olacaktır:

provision_a_set_of_instances()
{
  aws --output=text ec2 run-instances --image-id …   
}

veya JSON sürümü

provision_a_set_of_instances()
{
  aws --output=text ec2 run-instances --cli-input-json "$(provision_a_set_of_instances__json)"  
}

provision_a_set_of_instances__json()
{
  cat <<EOF
{
    "ImageId": … 
}
EOF
}

Her iki sürüm de esasen aynıdır, yükün büyük kısmı bir YAML veya JSON yapılarında başlatma değerlerinin sayımıdır.

Rastgele dokümantasyon adım 2: Sürekli Teslimat ve Yuvarlama Yükseltmeleri

Bu kılavuzun en büyük kısmı gerçekten ilginç bir özellik göstermiyor: değişkenleri tanıtıyor (IIRC, kabuk komut dosyalarının da değişkenleri var) !, ve bir Ansible modülü mysql'i ele alıyor; XY ayrıcalıklarına sahip ”ve gibi bir şeyle bit

# Create Application DB User
mysql --host "${mysql_host}" --user "${mysql_user}" --password "${mysql_password}" "${mysql_table}" <<EOF
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
EOF

" XY'de izin verilen ayrıcalıklara sahip bir mysql kullanıcısı nasıl oluşturabilirim ? " ifadesinden sonra arama yaparsınız.

- name: Create Application DB User
  mysql_user: name={{ dbuser }} password={{ upassword }}
              priv=*.*:ALL host='%' state=present

Fark hala muhtemelen çok anlamlı değil. Bu sayfada ayrıca Ansible'ın bir şablon meta programlama dili olduğunu da keşfettik.

{% for host in groups['monitoring'] %}
-A INPUT -p tcp -s {{ hostvars[host].ansible_default_ipv4.address }} --dport 5666 -j ACCEPT
{% endfor %}

Bunu gördüğümde, gerçekten rahatlık bölgemdeyim. Bilgilendirici diller için bu kadar basit bir meta-programlama, BSD Makefiles ile tam olarak aynı teorik paradigmadır! Hangi yoğun programlamış olur (Ben YAML ayrıştırıcı aracılığıyla benim playbooks koşamam böylece bu pasaj gösterileri bize YAML dosyası ile çalışma sözü kırık olduğunu örn ). Ayrıca, Ansible'ın değerlendirme düzeninin ince sanatını tartışması gerektiğini gösterir: değişkenlerin dilin “bildirimsel kısmında” mı yoksa dilin “zorunlu” meta kısmında mı genişletileceğine karar vermeliyiz. Burada kabuk programlama daha basittir, açık eval veya harici kod kaynak kullanımı dışında meta programlama yoktur . Varsayımsal eşdeğer kabuk alıntı

enumerate_group 'monitoring' | {
  while read host; do
    …
  done
}

Ansible değişkenine göre karmaşıklığı muhtemelen tolere edilebilir: dilde sade, düzenli, sıkıcı yapıları kullanıyor.

Rastgele dokümantasyon adım 3: Test stratejileri

Son olarak, Ansible'ın ilk ilginç özelliği olarak ortaya çıkan şeyleri karşılıyoruz : “Ansible kaynakları istenen durum modelleridir. Bu nedenle, hizmetlerin başlatıldığını, paketlerin yüklendiğini veya başka şeylerin test edilmesine gerek yoktur. Ansible, bu şeylerin yasal olarak doğru olmasını sağlayacak sistemdir. Bunun yerine, bu şeyleri oyun kitaplarınızda iddia edin. ”Şimdi biraz ilginç olmaya başlıyor, ancak:

  1. Mevcut modüller tarafından kolayca uygulanan bir avuç standart durum dışında, testi uygulayan bitleri beslemem gerekecek, muhtemelen bazı kabuk komutları içerecektir.

  2. Kurulumların uygunluğunu kontrol etmek, değişmez sunucu modelinin uygulandığı bağlamda çok ilgili olmayabilir: çalışan tüm sistemlerin genellikle bir ana görüntüden üretildiği (örneğin, örnek görüntü veya liman işçisi görüntüsü) - asla güncellenmez - bunun yerine yeni.

Ekli kaygı: sürdürülebilirlik

Ansible'dan gelen tanıtım materyali , sürdürülebilirlik sorusunu görmezden geliyor. Esasen hiçbir tip sistem bulunmadığından, kabuk komut dosyası çalıştırma JavaScript, Lisp veya Python'un bakım kolaylığı sağlar: kapsamlı yeniden yapılandırmalar, yalnızca kapsamlı bir otomatik testsuite - veya en azından etkileşimli testlere izin veren tasarımlar sayesinde başarılı bir şekilde gerçekleştirilebilir. Bununla birlikte, kabuk kodlaması , sistem konfigürasyonundan ve bakımdan gelen dil frangı olsa da, hemen hemen her programlama dili kabukla arayüze sahiptir. Bu nedenle, gelişmiş kabuk dil bitlerinin çeşitli bitlerini birbirine yapıştırmak için kullanarak, gelişmiş dillerin korunabilirlik avantajından yararlanmak tamamen olanaklıdır. OCaml için Rashell'i yazdım . Bu aslında, alt işlemler için ortak etkileşim kalıplarının bir elini sağlar; bu, yapılandırma komut dosyalarının OCaml'e çevirisini esasen önemsiz kılar.

Ansible'ın yanında, oyun kitaplarının çok zayıf bir yapısı ve bir meta-programlama özelliğinin varlığı, durumu kabuk komut dosyası için olduğu kadar kötü kılar; eksi bir durumda Ansible için birim testleri nasıl yazıldığının açık olmadığı noktalara dikkat çeker. ve geçici olarak daha yüksek seviyeli bir dil sunma argümanı taklit edilemez.

Yapılandırma adımlarının aksaklığı

Ansible'ın dokümantasyonu, belirsiz yapılandırma adımları yazmanın gerekliliğine dikkat çeker. Daha doğrusu, yapılandırma adımlarının adım dizisi böylece yazılmalıdır aba basitleştiirlebilir ab , biz tekrar yapılandırma adımı gerekmez yani. Bu, idrarsızlıktan daha güçlü bir durumdur. Ansible, oyun kitaplarının keyfi kabuk komutlarını kullanmalarına izin verdiğinden, Ansible'ın kendisi bu daha güçlü duruma uyulduğunu garanti edemez. Bu sadece programcının disiplinine dayanır.


Bu bir el kitabı gibi görünüyor ... etkileyici!
Pierre.Vriens

4
Daha fazla katılamadım. 1 yıldan fazla bir süredir Ansible'ı kullandık ve şimdi iyi, eski bash betikleriyle oluşturulmuş Docker kapsayıcılarını kullanıyoruz. Devleti tanımlamak da benim görüşüme göre en ilginç özellik, ancak daha önce de bahsettiğiniz gibi - buna karşılık gelen bir Ansible modülüne sahip olmayan pek çok hizmet var, bu yüzden her zaman yine de bash komutlarına geri dönmek zorundasınız. Ve evet, aynı zamanda sadece değişken konteynırları sunuculara dağıtacağız, bu yüzden durumu tanımlamak bu durumda gerçekten bir avantaj değil.
Andreas,

1
Ansible'ı iyice kullandıktan sonra, önceden yazdığım tüm noktaları onaylayabilirim. Idempotency olan olası ama onların makro sistemi ile çalışan, (kötü bir vatandaşın vmware_guest modülü bakınız) yanıtlayıcı 'tarafından uygulanan gerçek bir acıdır değil ve yapısal verileri üzerinde bile en temel işlemler gerçekleştirilmesine incredenly zor, bazı temel şeyler sadece yanlış yapıyorsun (playbook formatı, terapisiz bir Unix dosya modunu yiyemez) ve tek gerçek yararlı şey, yararlı için yazılmış yararlı fonksiyonların yüküdür. Yani eğer bu ürünü zorlayan Red Hat olmasaydı, geniş kabulü anlayamıyorum.
Michael Le Barbier Grünewald

1
@Andreas, kabiliyetinize veya komut modüllerine geri dönmeniz gereken birçok durum olduğunu hala kabul ediyorum. Çekirdek modüllerin kendileri, sadece eylemin yapılıp yapılmayacağını kontrol ederek boşluğu muhafaza eder. Aynı şeyi, önce bir şeyin yapılması gerekip gerekmediğini kontrol eden ve ardından çıktısını kaydeden bir görevi çalıştırarak, sonra da ilk görevden çıktısını temel alan ikinci görevi yerine getirerek bir görevi çalıştırarak kabuk veya komut modülüyle kendiniz de yapabilirsiniz.
Levi,

1
@ MichaelLeBarbierGrünewald, genel olarak aynı fikirdeyim, Ansible'la çalıştığımda, koşuya gelmek gerçekten acı vericiydi ve eski bulut tabanlı şirketimdeki altyapıya bağlanmak için bir oyun kitabı almak için haftalar süren çalışmaları linux'u tedarik etti. dağıtın, LAMP / LEMP veya her neyse kurun. Tamamlandıktan sonra bize zaman kazandırdı, ancak çalışmaya başlaması bir ay kadar sürdü. Hiçbirimiz usta bash senaryoları olmadık, bu alternatif değildi.
Daniel

22

Bu şekilde koyduğunuzda, Ansible'ın doğasında bazı avantajlar olsa bile, tanıdık araçlar kullanmanın (bu durumda kabuk komut dosyası yazma) faydaları değerlendirilmeli. Bunun kesin bir cevabı olduğunu sanmıyorum.

Eğer takım Ansible'ın sunduğu şeyleri shell ile başarabilirse:

  1. Declarative, idempotent yapılandırma yönetimi
  2. Endüstri popüler hizmetleri için yeniden kullanılabilir snippet'lere (örneğin oyun kitapları) erişim.
  3. Yeniden deneme, yuvarlanma mantığı vb. İle uzaktan çalıştırmanın güvenilir yönetimi

o zaman muhtemelen bildiklerine bağlı kalabiliyorlardı.

Sonuçta, “korumaları” BASH'da uygulayabilirsiniz. Orada çeşitli sunucu yapılandırma görevlerini çözmek için birçok BASH çalışması bulabilirsiniz (temelde% 90 bash kurulum kodu olan herhangi bir Dockerfile). Var olan tüm çözümünüzü bu araçlara aktarmak zorunda kalmadan, Ansible / Salt / Chef-Zero'nun size sunduklarına oldukça yaklaşabilirsiniz.

NIH (burada icat edilmedi) eğilimleri arasında dengeleyici bir hareket ve daha sağlam bir çözüm lehine iyi, yerleşmiş senaryolar çıkarmak.

Akılda tutulması gereken son bir husus: takıma daha fazla insan almayı denediğinizde teknoloji yığınız nasıl ölçülür? Ansible deneyimine sahip insanları bulmak, evde yetiştirilen özel komut dosyası CM aracınızda deneyimi olan kişileri bulmaktan çok daha kolaydır. Bu kesinlikle teknik bir düşünce değil, daha çok kültürel bir konu. Kendi Ansible'ını icat eden tuhaf bir kuruluş mu olmak istiyorsunuz yoksa iş için doğru aracı bulan makul bir kuruluş mu olmak istiyorsunuz? Bu karar yetenek yeteneğini etkiliyor.


4
Cevabını beğendim; Ayrıca bash takımı bağımsızlık, icra yönetimi ve yeniden kullanım için gidiyorsa, temelde kendi yapılandırma yönetimi çerçevesini yazıyorsa, bunun bir maliyeti olduğunu ve bunun hep içerdekilerdeki projeler için gerçekten kötü olabileceğini biliyoruz. .
ᴳᵁᴵᴰᴼ

Ayrıca, özellikle mevcut tecrübeyi dengede tuttum. İki küçük eleştirmenim var: Birincisi önemsizlik Bu, elbette konfigürasyon sistemlerinin önemli bir yönüdür, ancak makul oyun kitaplarında olası herhangi bir kabuk komutunu kullanmak mümkün olduğu için, sistem en iyi değersizliği kullanmaya teşvik edebilir . (Aslında, abaf = abp = abp = abp = abp = abol = abp = abp = abp = abp = abol = abp = abp = abp = abol = abol = abp = abp = abol = abp = abp = abol = abol = abol = abp = abp = abp = abol = abol = abol = abp = abp = abol = abol = abol = abp = abp = abp = abol = abol = abol = abp = abp = abol = abol = abol = abp = abp = abol = abol = abol = abol = abp = abp = abol = abol = abol = abp = abp = abol = abol = abol = abol = abp = abp = abol = abol = abol = abol = abp = abol = abp = abol = abol = abol = abol = abp = abp = aba = ab ).
Michael Le Barbier Grünewald

13

Yukarıdaki cevap bir kısmını kapsar ancak önemli unsurlardan birini özlüyor: yakınsak tasarım. Bir süre önce https://coderanger.net/thinking/ adresindeki Chef bağlamında bu konuda bazı kelimeler yazdım, ancak kısa versiyon bir Bash betiğinin bir dizi talimat olduğunu belirtirken, bir Ansible oyun kitabı (veya Chef tarifi, Salt). devlet, vs.) istenen durumun bir açıklamasıdır. Oraya almak istediğiniz adımlardan ziyade istediğiniz durumu belgeleyerek, daha birçok başlangıç ​​durumuyla başa çıkabilirsiniz. Bu uzun zaman önce CFEngine'de belirtildiği gibi Promise Theory'nin kalbi ve biz (config yönetim araçları) o zamandan beri kopyaladığımız bir tasarımdı.

tl; dr Ansible kodu istediğinizi söylüyor, bash kodu nasıl bir şey yapılacağını söylüyor.


2
Birisi hakkında bilgi edinmek isterse, kitaplar veya makaleler gibi "vaat edilen teori" ye bir referans ekleyebilir misiniz?
Evgeny

1
Aslında idempotent bash kodunu yazabileceğinizi söylediğimde bahsettiğim budur (yani, herhangi bir noktada başlayabilir, birçok kez çalıştırılabilir ve istenen duruma yakınlaşabilir). Ama cevabın çok netti.
Assaf Lavie

Evet, idempotence yakınsak sistemlerin önemli bir özelliğidir, ancak ikisi doğrudan bağlantılı değildir :) Promise Theory'deki materyallerde olduğu gibi, Mark Burgess'in (CFEngine'nin yaratıcısı) birkaç kitabı vardır, geri döndüğümde bağlantıları bulabilirim. dizüstü bilgisayar.
kodlayıcı


3

Ayrıca, eğlenceli oyun kitaplarınızı uzak ana bilgisayarlarda da çalıştırırken daha az sorun yaşayacağınıza dikkat etmeniz gerekir. Sorumluluk sahibi olmanın asıl nedeni olduğu gibi. Kabuk komut dosyası kullanıyorsanız, scp'ing'i uzaktaki ana bilgisayara komut dosyası yazmanın bir yolunu bulmanız gerekir.


Ansible bu anlamda sadece ssh etrafında bir sarmalayıcı değil mi?
Evgeny

Esasen, evet. Ssh yapar, python scriptlerini uzaktan kopyalar ve çalıştırır. Bunun anlamı, btw, eğer değişken modülünüz bir python kütüphanesine bağlıysa, bu kütüphane bazı durumlarda uzaktaki makinede bulunmalıdır.
Assaf Lavie

1
Ve ssh config'i bozarsanız, makinenizden kilitlenirsiniz, normal itme ve çekme dezavantajları.
Tensibai

0

Bu 2019 ve ben sadece birkaç gün sürdürebilir bir öğrenme eğrisine harcadım ve işte mutlak gerçek şu: Ansible belaya değmez.

bitmedi, pencerelerde çalışmıyor ve YAML config ve yanıltıcı hata mesajlarının kombinasyonu gözlerinizin kanamasına neden olur. Neredeyse bilerek korkunç görünüyor ve ben ciddiye demek. Bu açıkça redhat sysadmins sinirli geliştirici yan projesinin ürünü. Muhtemelen bir hipster.

Eğer şartnamenin ötesinde herhangi bir özellik gerektirmiyorsa ve sadece belirli bir işletim sistemi için hazırlık yapıyorsunuzdur. Yazık iyiliği için iyi bir shell.script yazın.

Şu an itibariyle, tüm proje bana noob'ların RTFM'ye söylendiği ve neden birinin grafik ayarlarının yapılandırılması için bir GUI yazamadığını sordukları linux forumlarını hatırlatıyor. Sadece anlamıyorsun değil mi? Pencerelere yapışmalısın ... belki ben çiftleşeceğim .. mutlu VI-ing.

Docker'ı kullanın. Bir şey tercih olarak. Docker, fevkalade basit ve güçlü.

Ama önceden var olan kalay üzerinde kesinlikle provizyon yapmanız gerekiyorsa ne olacak? Gerçek alternatifler neler?

Şey ... henüz yok. Ama sana söz veriyorum, suçlu iyileşmezse, yakında olacak. Çünkü hayranların zorlaması ne kadar zor olursa olsun, başarısızlıklarını affetmek ... çaba için 10 üzerinden 5'tir.

Bir bash betiği SCP ve kendinize sorun kurtarın.


İlk önce Win_RM veya SSH üzerinden pencerelerde çalışır. İkincisi, yaml sözdizimi çok hoş ve programatik bir şekilde oluşturulabilir ve bazı hatalar yanıltıcı olabilirken, Java ya da Python'dan bir istisna sırasında bağırsaklarını tıkayarak yanıltıcı olabilir. Üçüncüsü, sadece bir betiği bir sunucuya SCPing nosyonu oldukça dinamik bulut ortamlarında geçerli değildir. Hangi sunucu? Sunucular her gün değişebilirdi. Ansible, sunucuları gruplandırmanın kolay yollarını kullanarak kolayca yapılandırılabilir envanter eklentilerine izin verir ve onlara değişkenler atar. Ansible'ın buna değmeyeceğini sanmıyorum. Bence çevreniz için çok üzüldüm.
Levi,

@Levi evet. Hepsi benim penceremde hata yapmayan benim hatam, hiçbir şemaya sahip olmayan bir yapılandırmaya sahip, ve aynı görevi başarmak için herhangi bir ısmarlama yönteminden daha uzun bir öğrenme eğrisi ve daha yüksek bakım maliyetleri var.
Richard,

Bulut ortamları için, öğrenme eğrisini haklı çıkarabilecek büyük ölçekli işletmeler için başka yaklaşımlar vardır. Ansible'ın ne yaptığını anlıyorum. Ben sadece onun nişini göremiyorum.
Richard

Niş, birden fazla makine için kullanımı kolay bir otomasyon çerçevesidir. Linux için olduğu kadar Windows için de iyi değil. Msdos ve netware için de harika değil. 2019, windows sunucuları bugünlerde küçük işe yaramaz niş.
dyasny
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.