Sunucuda artık kullanılmayan rollerden nasıl temizlenir?


15

Diğer şeylerin yanı sıra, ilgili Ansible rolünün yüklendiği nginx, bazı temel yapılandırmaları gerçekleştirdiği /etc/nginxve güvenlik duvarında 80 ve 443 numaralı bağlantı noktalarını açtığı bir web sunucum olduğunu varsayalım .

Bir noktada o ana bilgisayarın artık bir web sunucusu olmamasını istiyorum, çünkü bir nedenden dolayı bu hizmeti başka bir yere taşıdım. Sadece [webservers]envanterdeki sunucuyu kaldırmak sunucuda çöp bırakacaktır. İdeal olarak, dizini (ve diğer bazı dizinleri) kaldırmak nginx, kaldırmak /etc/nginxve güvenlik duvarındaki 80 ve 443 bağlantı noktalarını kapatmak istiyorum.

Kukla'da bunu yapabilirim. Web sunucusu olan bir ana makinenin yapılandırmasında şöyle bir şey olacaktır:

class { 'nginx':
  ensure => present,
}

ve tek yapmam gereken "mevcut" u "yok" ile değiştirmek. Eğer nginxsınıf iyi yazılmış olup, bunun yaptığı değişiklikler geri alınır. (Genellikle yönetici "present" ifadesini "yok" ile değiştirir ve daha sonra, etkilenen tüm ana makinelerin yapılandırmayı geri aldığından emin olduğunda, öğeyi bildirimden kaldırır.)

Dahası, Kukla güvenlik duvarı modülünün artık bildirimde bulunmayan güvenlik duvarı kurallarını otomatik olarak kaldırdığını düşünüyorum; Bu yüzden, güvenlik duvarı için yukarıdaki "eksik" şeyi bile yapmanız gerekmediğini düşünüyorum, güvenlik duvarı yine de otomatik olarak kapanacaktır.

Ansible ile bunları nasıl başarabilirim?


1
Varsayımsal sorular gerçekten burada konu ile ilgili değil bence, sorunuzun kendisi haksız olmasa da. Yerine "hadi ... taklit" ifadeleri ve örneğin demek "kukla yılında bir sunucu rolünü değiştirebilir ve kaldırma nginx değiştirerek önceden yüklendiği olabilir ensure => present için ensure => absentde ... Nasıl yanıtlayıcı 'ile aynı şeyi hangi" vb İdeal daha önce denediğiniz her şeyin bir örneğiyle.
HBruijn

2
Ansible'ın bu tür şeyler için tasarlanmadığını iddia ediyorum. Tekrarlanabilir, tek kullanımlık sunucuları hedefliyor. Bir makinenin artık web sunucusu olmasını istemiyorsanız, onu yeniden yapmak yerine silmeniz (veya bir bulut örneği ise sonlandırmanız) yeterlidir.
ceejayoz

@ceejayoz Ansibles hakkında en çok okuduğum Orson Scott Card Card'ın Ender's Game & sequals'ında ama söylediğiniz şey bulut orkestrasyonunda çok anlamlı geliyor
HBruijn

@ceejayoz: Ansible'ı çoklu sunucu kurulumu için değil, küçük otonom sunucuları yapılandırmak için kullanıyorum. Bunun geçerli bir kullanım olduğunu düşünüyorum. Yani bir sunucuda nginx + django + PostgreSQL olabilir. Daha sonra nginx veya nginx + django'yu başka bir yere koymaya karar verirsem, tüm sunucuyu silerek ve PostgreSQL'i yedeklemeden geri getirmeye ihtiyaç duyarsak (kesinti süresinden bahsetmiyorum).
Antonis Christofides

Yanıtlar:


10

Ansible ile bunu gerçekten Kukla ile nasıl yapacağınızdan farklı yapamazsınız.

Nerede ayarlayacağınız örneğinizde

class { 'nginx':
  ensure => absent,
}

her şeyi kaldırmak için gerekli kodu yazmış olan o kukla modülünün yazarına güveniyorsunuz. Her kukla modülünde bu yoktur.

Benzer şekilde, Ansible ile, hem yüklemek hem de kaldırmak için gerekli adımlara sahip olan rolleriniz olabilir. Aradaki fark sadece ikisini nasıl çağırmaktır.

Bir yaklaşım, söz konusu rolün davranışı değiştirmek için bir değişken gösterdiği yaklaşım olabilir. Örneğin, bu nginx rolü bir değişken alabilir nginx_statedeğerleri alır installedve absent.

Rollerde, tasks/main.ymlyazarın çizgisinde bir şey olabilir.

- include: install.yml
  when: nginx_state|default('present') == "present"

- include: uninstall.yml
  when: nginx_state|default('present') == "absent"

... ilgili yükleme / kaldırma mantığı koşullu olarak dahil edilen iki dosya arasında bölünür.

Makul roller de iç içe olabilir. Aynı şeyi yapmanın başka bir yolu olarak, yazar rolleri, örneğin nginxiçinde başka bir rolle rol oynayabilir uninstalled. Daha sonra şunları yapabilirsiniz:

- name: Uninstall nginx
  hosts: some_group
  roles:
    - nginx/uninstalled

Ansible, Kukla ile karşılaştırıldığında tartışmalı olarak işlerin nasıl yapılması gerektiğine dair daha az kural ve yönergeye sahiptir, bu yüzden uygulamalar vahşi doğada biraz daha farklılık gösterir, ancak aynı kavramlar geçerlidir.


1
Teknik olarak argümanları doğrudan rollere geçirebilirsiniz, ancak iç içe rolü kullanmanızı tavsiye ederim. Gerçekten bir playbook bazı rol görmek garip bulurdum, bu aslında olarak tanımlandığı değişkenlerde beri playbook yürütme kaldırılır. İç içe geçmiş rol ile açık olması çok daha temiz görünüyor. Teknik olarak role ( - { role: nginx, state: absent }) argümanları iletmek mümkündür ama bana çok ayrıntılı geliyor. Gördüğüm iç içe rolün tek dezavantajı, üst değişken varsayılan vars bağlamak için gerekli oldu.
bogdan.mustiata

roles: -nginx/uninstalledÇalışmak gibi bir şey için ne yapmanız gerekiyor ? Her yere baktım, ancak iç içe rollerle ilgili herhangi bir belge bulamamı sağlayacak şekilde bulamıyorum.
aggregate1166877

1

Ansible'da konfigürasyon / provizyonunuz olduğundan, tüm sunucuyu havaya uçurabilir, yeni bir sunucuyu yeniden kurabilir / provizyon yapabilir ve çalışmak için güzel ve temiz bilinen bir duruma sahip olabilirsiniz.

Bunu başka amaçlar için "yeniden yapılandırmak" istiyorsanız, gerekli temizleme görevlerini yerine getiren yeni bir oyun kitabı oluşturmanız gerekir.

Bildiğim kadarıyla, tüm Ansible paketleme modülleristate=absent , verilen bir paketin sunucunuza yüklenmediğinden emin olmak için destekliyor . Ayrıca, aptmodülde purge=yeskalan özelleştirilmiş yapılandırma dosyalarını temizleyecek bir parametre bulunur.

Bağlantı noktası 80'in güvenlik duvarına sahip olduğunu onaylamak için görevler de oluşturabilirsiniz. Ancak, bu bağlantı noktasında çalışan herhangi bir işleminiz olmadığından, güvenlik duvarı sunucunuzun güvenliğinde herhangi bir fark yaratmaz.


Buna eklemek için, o roldeki oyunların çoğunun ekleyebileceğine bahse girerim state=absent. Yaptığınız yapılandırma değişikliklerinin büyük bir bölümünü silme veya geri alma şansı çok yüksek. Rolün ne kadar büyük olduğuna bağlı olarak, bu test etmek için gerçek bir PITA olabilir.
Christopher Karel
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.