Как детерминистически и воспроизводимо назначить увеличивающиеся номера портов в Ansible?


12

Я новичок в Ansible, но я должен поддерживать набор playbooks, которые соответствуют службам, которые будут установлены в данной среде. Им нужно назначить порт, сертификаты и т. Д. Это приводит ко многим файлам со списками по существу всегда одинаковых имен и назначению им.

Во многих случаях я думаю, что могу легко повторно использовать имя_службы как переменную, но при сопоставлении с IP-адресами, портами или другими числовыми идентификаторами я еще не нашел способ детерминистически назначать им разные номера таким образом, чтобы это можно было воспроизвести, и, предпочтительно, оно остается То же самое, даже когда добавляются новые услуги. Я рассмотрел возможность использования базы данных SQLite для хранения сервисов и создания значений из их идентификаторов, но я понятия не имею, как интегрировать это с Ansible.

Я предполагаю, что назначение увеличивающихся номеров портов не является чем-то совершенно новым; это то, к чему ежедневно прибегают системные администраторы, поэтому должен быть какой-то способ сделать это.

Изменить : мы напрямую добавляем номера портов и т. Д., group_vars/all.ymlКак это:

ports:
    service1:1024
    service2:1025
    service3:1026

Инвентарь создается автоматически, так как мы создаем дополнительные тюрьмы (BSD) и зависят от ролей, которые будут выполнены.


2
Поскольку вам, вероятно, все равно придется добавить службу в инвентарь, что мешает вам добавить определенный номер порта туда вручную? Или, если ваш инвентарь генерируется автоматически, то вам, вероятно, следует решить проблему на уровне создания инвентаря
— SztupY

Не могли бы вы включить некоторые Ansible фрагменты? Не ясно, используете ли вы group_varsили добавляете переменные прямо в файлы инвентаря. Также не ясно, как создается ваш инвентарь.
— Лесной Охотник

Рассматривали ли вы использовать инструмент обнаружения услуг, таких как Консул HashiCorp?
— Foghorn CTO

Ответы:


5

Отказ от ответственности: я не использую Ansible.

Я бы использовал случайное «предсказуемое» число. Согласно Ansible doc, вы можете запустить генератор случайных чисел:

Начиная с версии 2.3 Ansible также возможно инициализировать генератор случайных чисел из начального числа. Таким образом, вы можете создавать случайные, но идемпотентные числа:

"{{59 | random (семя = имя_хоста)}} * * * * root / script / from / cron"

Так что в вашем случае для номера порта (я полагаю, непривилегированный) я бы пошел на переменную с чем-то вроде:

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

Максимум на 32767, чтобы избежать конфликта с любым портом, инициированным клиентом (см. Эфемерный порт для причины).


Это хорошая идея, которую я рассмотрел, но она делает невозможным все возрастающее. Наличие определенных служб, которые логически связаны в определенном диапазоне портов, вероятно, очень желательно.
— мидор
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.