Установка имени узла динамически во время загрузки

Я создаю свой релиз с использованием relx, и я не могу использовать по умолчанию -sname someuser@127.0.0.1, Вместо этого я хотел бы сделать что-то вроде -sname someuser@`hostname -i`, чтобы определить публичный IP-адрес узла во время загрузки. С помощью -sname someuser@hostname -i`` не работает, потому что hostname -i не распространяется на реальный IP. Я пытался использовать net_kernel:start(xxxxxxx), но это не сработало.

Есть ли способ получить динамический -sname в vm.args используя relx?

Спасибо:)

2 ответа

Решение

Как написано в документации (и ответы в комментариях @Soup d'Campbells), -sname а также -name Флаги не нуждаются в имени хоста и будут автоматически заполнять Host часть идентификатора узла с идентификатором узла (сокращенное, не полностью определенное для -sname, полное доменное имя для -name):

-sname Name Превращает систему времени исполнения Erlang в распределенный узел, аналогично -name, но часть имени хоста имени узла Name@Host будет коротким именем, не полностью определенным.

Иногда это единственный способ запустить распределенный Erlang, если DNS (система доменных имен) не работает. Не может быть связи между узлами, работающими с флагом -sname, и узлами, работающими с флагом -name, поскольку имена узлов должны быть уникальными в распределенных системах Erlang.

-name Name Превращает систему времени исполнения Erlang в распределенный узел. Этот флаг активирует все сетевые серверы, необходимые для распределения узла. Смотрите net_kernel(3). Также гарантируется, что epmd запускается на текущем хосте до запуска Erlang. Смотрите epmd(1).

Имя узла будет Name@Host, где Host - это полное имя хоста текущего хоста. Для коротких имен используйте вместо этого флаг -sname.

Если вы планируете использовать распределенный узел, и у вас есть DNS в вашем домене, используйте -name флаг, так как он также вызовет все необходимые сетевые серверы (как написано выше).

Посмотреть на себя:

$> erl -sname bouly
(bouly@myserver)1>

$> erl -name bouly
(bouly@myserver.myhome.net)1>

Кажется, вы застряли net_kernel:start() с параметрами. Правильная форма аргумента: [Имя, короткие имена] или [Имя, длинные имена]; Имя - это атом, который должен быть сформирован как "localpart" или "localpart @host" (скорее всего, вам понадобится list_to_atom() за это). Например:

2> net_kernel:start(['abc@localhost', shortnames]).
{ok,<0.39.0>}

и, как результат:

$ epmd -names
epmd: up and running on port 4369 with data:
name abc at port 46623
Другие вопросы по тегам