Comment attribuer de manière déterministe et reproductible des numéros de port croissants dans Ansible?

12

Je suis nouveau sur Ansible, mais je dois maintenir un ensemble de playbooks, qui correspondent à des services à configurer dans un environnement donné. Il faut leur affecter un port, des certificats, etc.

Dans de nombreux cas, je pense que je peux facilement réutiliser le nom_service en tant que variable, mais lors du mappage vers des adresses IP, des ports ou d'autres identificateurs numériques, je n'ai pas encore trouvé de moyen de leur affecter de manière déterministe différents numéros d'une manière qui est reproductible, et reste de préférence le même lorsque de nouveaux services sont ajoutés. J'ai envisagé d'utiliser une base de données SQLite pour stocker les services à partir de et pour générer les valeurs à partir de leurs identifiants, mais je ne sais pas comment intégrer cela à Ansible.

Je suppose que l'attribution de numéros de port croissants n'est pas quelque chose de tout à fait nouveau; c'est quelque chose que beaucoup d'administrateurs système doivent accomplir au quotidien, donc il doit y avoir un moyen de le faire.

Edit : Nous ajoutons directement les numéros de port, etc., group_vars/all.ymlcomme ceci:

ports:
    service1:1024
    service2:1025
    service3:1026

L'inventaire est généré automatiquement, car nous créons des prisons supplémentaires (BSD) et dépend des rôles qui seront exécutés.

midor
la source
2
Puisque vous devez probablement ajouter le service à l'inventaire de toute façon, qu'est-ce qui vous empêche d'y ajouter manuellement un numéro de port spécifique? Ou si votre inventaire est généré automatiquement, vous devriez probablement résoudre le problème au niveau de la génération de l'inventaire
SztupY
Souhaitez-vous inclure des extraits Ansible? Il n'est pas clair si vous utilisez group_varsou ajoutez des variables directement dans les fichiers d'inventaire. Il est également difficile de savoir comment votre inventaire est généré.
Woodland Hunter
Avez-vous envisagé d'utiliser un outil de découverte de services comme le consul de HashiCorp?
Foghorn CTO

Réponses:

5

Avertissement: je n'utilise pas Ansible.

Ce que je ferais, c'est utiliser un nombre aléatoire "prévisible". Selon Ansible doc, vous pouvez amorcer le générateur de nombres aléatoires:

Depuis la version 2.3 d'Ansible, il est également possible d'initialiser le générateur de nombres aléatoires à partir d'une graine. De cette façon, vous pouvez créer des nombres aléatoires mais idempotents:

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

Donc, dans votre cas, pour un numéro de port (je suppose sans privilège), je choisirais une variable avec quelque chose comme:

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

Max à 32767 pour éviter les conflits avec tout port initié par le client (voir Port éphémère pour la raison).

Tensibai
la source
C'est une bonne idée, que j'ai envisagée, mais cela rend impossible la partie croissante imo. Avoir certains services qui sont logiquement liés dans une certaine plage de ports est probablement très souhaitable.
midor