Wie würden Sie mit Ansible gehen, um zu bestätigen, ob ein Dienst an einem bestimmten Port ausgeführt wird?
Zum Beispiel:
Ich verstehe, dass es die Befehle service
und wait_for
gibt, die einzeln prüfen, ob ein Dienst läuft und ob ein Port verwendet wird - aber ich habe noch nichts gefunden, um zu überprüfen, ob ein bestimmter Dienst existiert an einem bestimmten Port hören. service
und wait_for
zeigen an, dass es einen Dienst und einen Port gibt, aber es gibt keine Garantie dafür, dass der Port von diesem bestimmten Dienst verwendet wird - er könnte von allem genommen werden. wait_for
, wie ich es verstehe, überprüft einfach, ob es verwendet wird.
Es gibt einen regex_search
-Parameter auf wait_for
, der das Suchen in einer Socket-Verbindung für eine bestimmte Zeichenkette erwähnt, aber wie ich es verstehe, liest es einfach alle Informationen, die aus dem Socket kommen, anstatt irgendeinen Zugriff darauf zu haben Senden dieser Informationen.
Wie können wir das machen?
Es gibt ein paar Möglichkeiten, Ihre Frage zu interpretieren, also werde ich versuchen, beide zu beantworten:
Wenn Sie überprüfen möchten, ob ein bestimmter Port ein bestimmtes Anwendungsprotokoll bedient, würde ich dies überprüfen, indem Sie einen geeigneten Client ausführen.
Um Apache und Tomcat zu überprüfen, würde ich GET
eine spezifische URL eingeben und den Ergebniscode überprüfen. Zum Beispiel:
Und ähnlich für Tomcat.
Um MySQL zu überprüfen, würde ich den MySQL-Client verwenden:
%Vor% Wenn Sie wirklich sehen wollten, welcher Prozess einen bestimmten Port geöffnet hat, könnten Sie ss
und grep
kombinieren, aber das erscheint seltsam und unnötig. Etwas wie:
Wenn Sie eine bestimmte Prozess-ID überprüfen möchten, könnten Sie etwas Ähnliches mit lsof
:
Aber ich finde diese Optionen nicht unbedingt besonders nützlich. Die Service-Checks im vorherigen Abschnitt scheinen geeigneter zu sein.
Es gibt kein integriertes Modul, das eine Kombination aus einem Port und einem Service überprüft. Was Sie wahrscheinlich tun müssen, ist herauszufinden, einen entsprechenden Aufruf an einen Befehl wie Netstat und rufen Sie dies über die Befehl oder < a href="http://docs.ansible.com/shell_module.html"> Shell Module. Zum Beispiel zeigt der folgende Befehl auf einer Linux-Box an, welcher Prozess Port 80 überwacht:
%Vor%Also von Ansible würden Sie wahrscheinlich so etwas tun wollen:
%Vor%Wenn Sie etwas schicker sein möchten, könnten Sie ein Shell-Skript schreiben, das den Netstat-Aufruf kapselt und die Ausgabe etwas ausführlicher analysiert / validiert, bevor die Ergebnisse ans ansible zurückgegeben werden. Aber dann müssen Sie dieses Skript vor dem Aufruf installieren.
AFAIK gibt es kein eingebautes Modul, das dies tut. Wahrscheinlich ist es trivial, es mit dem Shell-Modul zu tun oder einen kleinen Shell-Befehl zu schreiben, der alle Überprüfungen durchführt.
Sie können den Befehl fuser
verwenden, um zu überprüfen, welcher Prozess an einem bestimmten TCP-Port abgehört wird:
Sie können ps
verwenden, um den Namen des Prozesses zu sehen:
Kombinieren Sie alles:
%Vor% Vielleicht betrachten Sie dieses Problem mit einem falschen Ansatz.
Sie würden Konfigurationsverwaltungssysteme (wie Ansible) verwenden, um Änderungen an Ihrem System vorzunehmen, aber Sie würden etwas wie Serverspec
verwenden, um sicherzustellen, dass korrekte Prozesse die richtigen Ports abhören.
Darüber hinaus sollten Ihre Playbooks so aufgebaut sein, dass Sie sich nie in einer mehrdeutigen Situation befinden, in der verschiedene Dienste auf den gleichen Ports hören können.