Ansible: Autre option disponible pour la vérification telnet des ports ouverts?

15

Je suis nouveau à Ansible. Voici ma tâche ...

J'ai plus de 400 hôtes et je dois vérifier si 5 ports différents sont ouverts de leur extrémité à notre serveur Web.

Individuellement, je pouvais me connecter et exécuter:

telnet mywebserver.com 443
telnet mywebserver.com 80
telnet mywebserver.com 8443

..etc..

Quel module ou plugin pourrait être utilisé dans Ansible afin que je puisse automatiser cela et le faire rapporter les résultats (ports ouverts ou fermés) à mon serveur Ansible?

AWhitaker
la source

Réponses:

28

Vous pouvez utiliser le module Ansible wait_for qui vérifie qu'un port TCP spécifique est ouvert.

Étant donné que dans ce cas, tous les ports doivent déjà être ouverts, nous pouvons utiliser un non minimal. de tentatives, juste assez pour couvrir les problèmes de réseau:

- name: Check all port numbers are accessible from current host
  wait_for:
    host: mywebserver.com
    port: "{{ item }}"
    state: started         # Port should be open
    delay: 0               # No wait before first check (sec)
    timeout: 3             # Stop checking after timeout (sec)
  ignore_errors: yes
  with_items:
    - 443
    - 80
    - 80443

Par défaut, Ansible vérifiera une fois par seconde (configurable dans Ansible 2.3 en utilisant l' sleepattribut), donc cela vérifiera 3 fois par port.

Exécutez cela dans un playbook par rapport à votre inventaire de plus de 400 hôtes - Ansible vérifiera en parallèle que tous les hôtes peuvent atteindre mywebserver.comces ports.

Nous utilisons ignore_errors: yesici afin que toutes les erreurs soient marquées en rouge mais n'arrêtent pas l'exécution.

Les ports ouverts sont signalés comme des okéléments dans la sortie et les ports fermés sont signalés comme failed(vous devez utiliser le -vvdrapeau sur ansible-playbookpour voir cette sortie).

Sortie de réglage fin

Si vous souhaitez une sortie plus spécifique pour les cas de réussite et d'échec, le code doit être plus complexe, en ajoutant une deuxième tâche:

  • wait_fortâche doit registerune variable
  • la deuxième tâche produit une sortie debugbasée sur la condition de réussite / d'échec (par exemple en utilisant l' expression conditionnelle Jinja2 )
  • vous devez ensuite placer ces deux tâches dans un fichier include (sans aucune with_itemsboucle) et écrire une tâche principale du playbook qui utilise un include... with_itemspour appeler le fichier include une fois par port.
RichVel
la source
Surtout, ils auraient besoin de régler host: mywebserver.com.
Boycott SE pour Monica Cellio
@XiongChiamiov - host: xn'est pas requis. Je viens de retester avec Ansible 2.3.1 et l' hostattribut des wait_fortâches par défaut au serveur actuel est traité à partir de l'inventaire.
RichVel
Exactement, c'est pourquoi OP doit le remplacer: ils testent la connectivité à un autre serveur Web à partir de tous leurs serveurs (relisez la question).
Boycott SE pour Monica Cellio
2
Bon point, ont mis à jour la réponse avec hostsattribut.
RichVel
Je vous remercie! Cela fonctionne pour moi et me donne suffisamment de travail.
AWhitaker
2

AFAIK il n'y a pas de module intégré à cet effet, mais vous pouvez utiliser shell+ nc:

---
- hosts: all
  tasks:
    - shell: nc -z -w 1 -G 1 my.hostname.com {{ item }} || echo "Port {{ item }} is closed"
      with_items: [80,443,8443]
Konstantin Suvorov
la source
2
Merci, cela fonctionne aussi, mais j'ai opté pour la première suggestion car cela me permet de personnaliser davantage le jeu.
AWhitaker
Qu'est-ce que -G 1je ne trouve pas dans les pages de manuel?
lonix
0

Vous pouvez utiliser le module wait_for pour le même

exemple cité dans la documentation:

- name: Wait 300 seconds for port 8000 of any IP to close active connections, don't start checking for 10 seconds
  wait_for:
    host: 0.0.0.0
    port: 8000
    delay: 10
    state: drained
user128364
la source
Veuillez essayer de formater votre message correctement, tous les sites du réseau StackExchange permettent le même démarque, la documentation pour le formatage est ici
Tensibai
3
BTW J'échoue aussi à voir ce que cette réponse ajoute qui n'est pas déjà dans la réponse
RichVel
0

Nous utilisons notre outil dda-serverspec ( https://github.com/DomainDrivenArchitecture/dda-serverspec-crate ) pour de telles tâches. Vous pouvez définir votre attente

{:netcat [{:host "mywebserver.com" :port "443"} {:host "telnet mywebserver.com" :port "80"} {:host "telnet mywebserver.com" :port "8443"}]}

et tester ces attentes contre localhost ou remote par ssh. Pour les tests à distance, vous devez définir une cible:

{:existing [{:node-name "test-vm1"
:node-ip "35.157.19.218"}
{:node-name "test-vm2" :node-ip "18.194.113.138"}] :provisioning-user {:login "ubuntu"}}

Vous pouvez exécuter le test en java -jar dda-serverspec.jar --targets targets.edn serverspec.edn

secousse
la source