¿Cómo asignar de manera determinista y reproducible números de puertos crecientes en Ansible?

12

Soy nuevo en Ansible, pero tengo que mantener un conjunto de libros de jugadas, que corresponden a los servicios que se configurarán en un entorno determinado. Se les debe asignar un puerto, certificados, etc. Esto da como resultado muchos archivos con listas de esencialmente siempre los mismos nombres y una asignación a ellos.

En muchos casos, creo que puedo reutilizar fácilmente el nombre_servicio como variable, pero al mapear a IP, puertos u otros identificadores numéricos aún no he encontrado una manera de asignarles de manera determinista diferentes números de una manera que sea reproducible, y preferiblemente sigue siendo el igual incluso cuando se agregan nuevos servicios. He considerado usar una base de datos SQLite para almacenar los servicios y generar los valores de sus identificadores, pero no tengo idea de cómo integrar eso con Ansible.

Supongo que asignar números de puerto crecientes no es algo completamente nuevo; es algo que muchos administradores de sistemas hacen a diario, por lo que tiene que haber alguna forma de hacerlo.

Editar : agregamos directamente los números de puerto, etc. de group_vars/all.ymlesta manera:

ports:
    service1:1024
    service2:1025
    service3:1026

El inventario se genera automáticamente, ya que creamos cárceles adicionales (BSD) y depende de los roles que se ejecutarán.

midor
fuente
2
Dado que probablemente tenga que agregar el servicio al inventario de todos modos, ¿qué le impide agregar un número de puerto específico allí manualmente? O si su inventario se genera automáticamente, entonces probablemente debería resolver el problema a nivel de generación de inventario
SztupY
¿Podría incluir algunos fragmentos de Ansible? No está claro si está utilizando group_varso agregando variables directamente en los archivos de inventario. Tampoco está claro cómo se genera su inventario.
Woodland Hunter
¿Has considerado usar una herramienta de descubrimiento de servicios como el Cónsul de HashiCorp?
Foghorn CTO

Respuestas:

5

Descargo de responsabilidad: no estoy usando Ansible.

Lo que haría es usar un número aleatorio "predecible". Según el documento de Ansible, puede generar el generador de números aleatorios:

A partir de la versión 2.3 de Ansible, también es posible inicializar el generador de números aleatorios a partir de una semilla. De esta manera, puede crear números aleatorios pero idempotentes:

"{{59 | random (seed = Inventory_hostname)}} * * * * root / script / from / cron"

Entonces, en su caso para un número de puerto (supongo que no tiene privilegios), elegiría una variable con algo como:

port="{{ 32767 |random(start=1024,seed=service_name) }}"

Máx. En 32767 para evitar conflictos con cualquier puerto iniciado por el cliente (consulte el puerto efímero para conocer el motivo).

Tensibai
fuente
Esa es una buena idea, que consideré, pero hace que la parte creciente sea imposible. Tener ciertos servicios que están relacionados lógicamente en un cierto rango de puertos es probablemente muy deseable.
midor