Установка имени узла динамически во время загрузки
Я создаю свой релиз с использованием 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