Wie bereinige ich Dinge von Rollen, die auf einem Server nicht mehr verwendet werden?

15

Angenommen, ich habe einen Host, bei dem es sich unter anderem um einen Webserver handelt, auf dem die zugehörige Ansible-Rolle installiert wird nginx, der einige wichtige Konfigurationsschritte ausführt /etc/nginxund die Ports 80 und 443 in der Firewall öffnet.

Irgendwann möchte ich, dass dieser bestimmte Host kein Webserver mehr ist, weil ich diesen Service aus irgendeinem Grund an einen anderen Ort verlegt habe. Wenn Sie den Server nur aus [webservers]dem Inventar entfernen, verbleibt Müll auf dem Server. Im Idealfall möchte ich deinstallieren nginx, das /etc/nginxVerzeichnis (und einige andere Verzeichnisse) entfernen und die Ports 80 und 443 in der Firewall schließen.

In Puppet kann ich das machen. Ein Host, der ein Webserver ist, hat in seiner Konfiguration etwa Folgendes:

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

und alles, was ich tun muss, ist, "Gegenwart" durch "Abwesend" zu ersetzen. Wenn die nginxKlasse gut geschrieben ist, werden die vorgenommenen Änderungen rückgängig gemacht. (In der Regel ersetzt ein Administrator "Vorhanden" durch "Abwesend". Wenn er später sicher ist, dass alle betroffenen Hosts die Konfiguration rückgängig gemacht haben, entfernt er das Element aus dem Manifest.)

Außerdem werden vom Puppet-Firewall-Modul automatisch Firewall-Regeln entfernt, die nicht mehr im Manifest enthalten sind. Daher denke ich, dass Sie für die Firewall nicht einmal das "fehlende" oben tun müssen, da die Firewall sowieso automatisch geschlossen wird.

Wie kann ich diese Dinge mit Ansible erreichen?

Antonis Christofides
quelle
1
Ich denke, hypothetische Fragen sind hier nicht wirklich zum Thema geworden, obwohl Ihre Frage selbst nicht unbegründet ist. Anstatt "Lass uns so tun als ob ..." umformulieren und zum Beispiel sagen: "In Puppet kann ich eine Serverrolleensure => present ensure => absent ändern und Nginx deinstallieren, das zuvor installiert wurde, indem ich zu dem wechsle , der auch ... Wie man dasselbe mit Ansible macht" usw. Idealerweise mit einem Beispiel für alles, was Sie bereits versucht haben.
HBruijn
2
Ich würde behaupten, Ansible ist nicht wirklich für so etwas konzipiert. Es zielt auf reproduzierbare Einweg-Server ab. Wenn Sie nicht möchten, dass ein Computer mehr als Webserver fungiert, löschen Sie ihn einfach (oder beenden ihn, wenn es sich um eine Cloud-Instanz handelt), anstatt ihn erneut zu verwenden.
Ceejayoz
@ceejayoz die ich über Ansibles gelesen habe , ist in Orson Scott Card - Karte von Enders Spiel & Sequals aber was sagen Sie sehr viel Sinn in Cloud - Orchestrierung macht
HBruijn
@ceejayoz: Ich verwende Ansible derzeit nicht für die Einrichtung mehrerer Server, sondern zum Konfigurieren kleiner autonomer Server. Ich denke, das ist eine gültige Verwendung. Ein Server kann also nginx + django + PostgreSQL haben. Wenn ich mich später dazu entscheide, nginx oder nginx + django an einem anderen Ort zu platzieren, würde es suboptimal erscheinen, den gesamten Server auszulöschen und PostgreSQL von der Sicherung zurückzubringen (ganz zu schweigen von den Ausfallzeiten).
Antonis Christofides

Antworten:

10

Mit Ansible würden Sie das nicht wirklich anders machen als mit Puppet.

In deinem Beispiel, wo du setzen würdest

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

Sie verlassen sich darauf, dass der Autor dieses Marionettenmoduls den erforderlichen Code geschrieben hat, um alles zu entfernen. Nicht jedes Puppenmodul hat dies.

In ähnlicher Weise verfügen Sie bei Ansible möglicherweise über Rollen, die sowohl die erforderlichen Schritte zum Installieren als auch zum Entfernen enthalten. Der Unterschied besteht nur darin, wie man die beiden aufruft.

Ein Ansatz könnte ein Ansatz sein, bei dem die betreffende Rolle eine Variable zum Umschalten des Verhaltens verfügbar macht. Beispielsweise kann diese Nginx-Rolle eine Variable annehmen, nginx_statedie die Werte installedund annimmt absent.

In den Rollen tasks/main.ymlkönnte der Rollenautor etwas in der Art von ... haben.

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

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

..mit der jeweiligen Installations- / Deinstallationslogik, die auf diese beiden bedingten Dateien aufgeteilt wird.

Ansible Rollen können auch verschachtelt werden. Als eine andere Möglichkeit, das Gleiche zu tun, könnte ein Rollenautor beispielsweise eine Rolle nginxmit einer anderen Rolle in sich bereitstellen, die als "Rolle" bezeichnet wird uninstalled. Sie könnten dann tun:

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

Ansible hat im Vergleich zu Puppet vermutlich weniger Regeln und Richtlinien, wie Dinge zu tun sind, so dass die Praktiken in der Natur ein bisschen mehr variieren, aber die gleichen Konzepte gelten.

Nick Groenen
quelle
1
Technisch gesehen können Sie Argumente auch direkt an die Rollen übergeben, ich würde jedoch die Verwendung der verschachtelten Rolle empfehlen. Ich würde es wirklich seltsam finden, in einem Playbook eine Rolle zu sehen, die bei der Ausführung des Playbooks tatsächlich deinstalliert wird, da sie in den Variablen als solche definiert ist. Es scheint viel sauberer zu sein, es explizit über die verschachtelte Rolle zu haben. Technisch ist es möglich, Argumente an role ( - { role: nginx, state: absent }) zu übergeben, aber es scheint mir äußerst ausführlich zu sein. Der einzige Nachteil der verschachtelten Rolle, die ich gesehen habe, war, dass ich die Standardvariablen vom übergeordneten Objekt verknüpfen musste.
bogdan.mustiata
Was müssen Sie tun, damit etwas roles: -nginx/uninstalledfunktioniert? Ich habe überall nachgesehen, kann aber keine Dokumentation zu Sammelrollen finden, die mir dies ermöglicht.
aggregate1166877
1

Da Sie Ihre Konfiguration / Bereitstellung in Ansible haben, können Sie einfach den gesamten Server wegblasen, einen neuen Server neu installieren / bereitstellen und einen guten, sauberen und bekannten Status haben, um damit zu arbeiten.

Wenn Sie es tatsächlich für andere Zwecke "neu konfigurieren" möchten, müssen Sie ein neues Playbook erstellen, das die erforderlichen Bereinigungsaufgaben ausführt.

Soweit mir bekannt ist, unterstützen alle Ansible- Paketmodule, um state=absentsicherzustellen, dass ein bestimmtes Paket nicht auf Ihrem Server installiert ist. Darüber hinaus verfügt das aptModul über purge=yesParameter, die alle verbleibenden benutzerdefinierten Konfigurationsdateien bereinigen.

Sie können auch Aufgaben erstellen, um zu bestätigen, dass Port 80 durch eine Firewall geschützt ist. Da auf diesem Port jedoch keine Prozesse ausgeführt werden, hat die Firewalling-Funktion keinen Einfluss auf die Sicherheit Ihres Servers.

Mxx
quelle
Um dies hinzuzufügen, wette ich, dass die meisten Spiele in dieser Rolle hätten state=absenthinzugefügt werden können. Es besteht eine gute Chance, dass ein Großteil der von Ihnen vorgenommenen Konfigurationsänderungen gelöscht oder rückgängig gemacht wird. Je nachdem, wie groß die Rolle ist, kann dies eine echte PITA sein, die getestet werden muss.
Christopher Karel