Ansible: ¿hay otra opción disponible para la verificación telnet de puertos abiertos?

15

Soy nuevo en Ansible. Aquí está mi tarea ...

Tengo más de 400 hosts y necesito verificar si 5 puertos diferentes están abiertos desde su extremo a nuestro servidor web.

Individualmente, podría iniciar sesión y ejecutar:

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

..y así..

¿Qué módulo o complemento podría usarse en Ansible para poder automatizar esto y hacer que informe los resultados (ya sean puertos abiertos o cerrados) a mi servidor Ansible?

AWhitaker
fuente

Respuestas:

28

Puede usar el módulo Ansible wait_for que verifica que un puerto TCP específico esté abierto.

Como en este caso, todos los puertos ya deberían estar abiertos, podemos usar un no mínimo. de reintentos, lo suficiente para cubrir problemas de red:

- 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

De manera predeterminada, Ansible verificará una vez por segundo (configurable en Ansible 2.3 usando el sleepatributo), por lo que esto se verificará 3 veces por puerto.

Ejecute esto en un libro de jugadas contra su inventario de más de 400 hosts: Ansible verificará en paralelo que todos los hosts puedan llegar mywebserver.coma esos puertos.

Usamos ignore_errors: yesaquí para que los errores estén marcados en rojo pero no detengan la ejecución.

Los puertos abiertos se informan como okelementos en la salida y los puertos cerrados se informan como failed(debe usar el -vvindicador activado ansible-playbookpara ver esta salida).

Salida de ajuste fino

Si desea una salida más específica para los casos de éxito y fracaso, el código debe ser más complejo, agregando una segunda tarea:

  • wait_fortarea debe registeruna variable
  • la segunda tarea produce resultados utilizando la debugcondición de éxito / fracaso (por ejemplo, utilizando la expresión condicional Jinja2 )
  • entonces debe colocar ambas tareas en un archivo de inclusión (sin ningún with_itemsbucle) y escribir una tarea principal de libro de jugadas que use un include... with_itemspara llamar al archivo de inclusión una vez por puerto.
RichVel
fuente
Es importante destacar que tendrían que configurar host: mywebserver.com.
Boicot SE para Monica Cellio
@XiongChiamiov: host: xno es obligatorio. Acabo de volver a probar con Ansible 2.3.1 y el hostatributo de wait_fortareas predeterminado es el servidor actual que se procesa desde el inventario.
RichVel
Exactamente, es por eso que OP necesita anularlo: están probando la conectividad a otro servidor web desde todos sus servidores (vuelva a leer la pregunta).
Boicot SE para Monica Cellio
2
Buen punto, he actualizado la respuesta con hostsatributo.
RichVel
¡Gracias! Esto funciona para mí y me da lo suficiente para trabajar.
AWhitaker
2

AFAIK no hay un módulo incorporado para este propósito, pero puede usar 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
fuente
2
Gracias, esto también funciona, pero opté por la primera sugerencia, ya que me permite personalizar aún más la obra.
AWhitaker
¿Qué es -G 1lo que no puedo encontrar en las páginas de manual?
lonix
0

Puedes usar el módulo wait_for para el mismo

ejemplo citado de la documentación:

- 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
usuario128364
fuente
Intente formatear su publicación correctamente, todos los sitios en la red StackExchange permiten la misma rebaja, la documentación para formatear está aquí
Tensibai
3
Por cierto, yo tampoco veo lo que agrega esta respuesta que no está en la respuesta de
RichVel
0

Utilizamos nuestra herramienta dda-serverpec ( https://github.com/DomainDrivenArchitecture/dda-serverspec-crate ) para tales tareas. Puedes definir tus expectativas

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

y pruebe estas expectativas ya sea contra localhost o remoto mediante ssh. Para las pruebas remotas, debe definir un objetivo:

{: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"}}

Puede ejecutar la prueba por java -jar dda-serverspec.jar --targets targets.edn serverspec.edn

jerger
fuente