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

12

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

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

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

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

ports:
    service1:1024
    service2:1025
    service3:1026

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

Midor
источник
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, чтобы избежать конфликта с любым портом, инициированным клиентом (см. Эфемерный порт для причины).

Tensibai
источник
Это хорошая идея, которую я рассмотрел, но она делает невозможным все возрастающее. Наличие определенных служб, которые логически связаны в определенном диапазоне портов, вероятно, очень желательно.
мидор