Erlang,覆盖环境

时间:2014-06-13 05:01:20

标签: erlang config

我有一个带有一些应用程序的erlang节点。我想让我的应用程序从某个集中式服务器(例如hiera server)获取其环境变量。有没有办法覆盖.app文件中的环境变量,用从某个地方获取的自定义变量替换它? 当然,我不想对我的应用程序代码进行任何更改。

1 个答案:

答案 0 :(得分:5)

如果您想完全避免更改应用程序的代码,最好的办法是使用外部配置文件并从中央服务器复制到每个本地"服务器。如果在sys.config中的应用程序列表末尾指定文件路径(假设您正在使用版本),BEAM VM也会将此文件作为附加配置加载。

使用此功能,您可以在/etc/my_service/extended.config之类的位置创建文件,并使用某种服务或其他服务自动更新。 Puppet是一个可以为你做这个部分的工具的例子;看起来像Hiera(我不熟悉)会是另一个。

为清楚起见,使用此方法,您的sys.config文件应如下所示:

[
    {my_app1, [
            {my_param1, 1},
            {my_param2, "string"}
        ]},
    {my_app2, [
            ...
        ]},
    "/etc/my_service/extended.config"
].

但是,这种方法有一些显着的局限性,即配置文件只加载一次,如果要在服务运行时更改它,则必须重新启动BEAM VM。如果您正在生成Erlang版本(因此sys.config),它也会效果最佳。

如果您没有使用Erlang版本且没有sys.config文件,您仍然可以使用-config命令行参数指定配置文件{{1} }

最好的方法,IMO,需要您对您的应用程序进行一些小修改。我建议将参数存储在分布式mnesia表(或任何其他数据库中,实际上,只要您可以轻松查询它)。随后,通过调用您定义的函数替换您的erl调用,该函数会在回退到application:get_env/2,3之前检查您存储设置的数据库。

例如:

application:get_env/2,3