2014-06-13 2 views
2

일부 응용 프로그램과 함께 erlang 노드가 있습니다. 중앙 집중식 서버 (예 : hiera server)에서 환경 변수를 가져 오도록 응용 프로그램을 만들고 싶습니다. .app 파일의 환경 변수를 무시하고 특정 위치에서 가져온 맞춤 변수로 바꾸는 방법이 있습니까? 물론 응용 프로그램 코드를 변경하고 싶지는 않습니다.Erlang, override environment

+0

가 자동으로 사용 제외 "어떤 변화가 만들고 싶어하지 않는다"않습니다는 '/ 3 set_env'? – Alexander

+0

나는'set_env/3'가 적절하다고 생각하지만, 내 응용 프로그램에서 이러한 논리를 유지하지 않는 방법을 찾고 있습니다. 특정 응용 프로그램을 사용하고, 다른 응용 프로그램보다 먼저로드되며, 다른 응용 프로그램을 설정하는 것이 적절하다고 생각하십시오. –

+0

'application : get_env/1,2,3'는 매우 동시적인 시나리오에서 쉽게 병목이 될 수 있으므로, 예를 들어 gen_server init 단계에서만이를 수행하고 configs를 상태로 두는 것이 좋습니다. 따라서 응용 프로그램 시작 후 env를 설정하면 구성 업데이트를 처리하기 위해 사용자 지정 논리를 작성해야합니다. – danechkin

답변

3

응용 프로그램 코드의 변경을 완전히 피하려면 외부 구성 파일을 사용하고 중앙 서버에서 각 "로컬"서버로 복사하는 것이 가장 좋습니다. sys.config에서 애플리케이션 목록 끝에 파일 경로를 지정하면 (릴리스를 사용 중이라고 가정) BEAM VM은이 파일을 추가 구성으로로드합니다.

사용하면 /etc/my_service/extended.config와 같은 위치에서 파일을 만들고 일부 서비스 또는 다른 서비스를 사용하여 자동으로 업데이트 할 수 있습니다. 인형은 당신을 위해 그 부분을 할 수있는 도구의 예입니다. Hiera (나는 그것에 익숙하지 않다)가 다른 것이 될 것 같아 보인다.

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

그러나 접근 방식의 종류, 몇 가지 중요한 제한 사항이 있습니다 즉 점에서 구성 파일을 한 번만로드, 그리고 : 같은 명확성을 위해

,이 방법으로, 당신의 SYS.CONFIG 파일이 보일 것입니다 BEAM VM을 서비스를 실행하는 동안 변경하려면 BEAM VM을 다시 시작해야합니다. 또한 Erlang 릴리스 (따라서 sys.config)를 생성하는 경우 가장 효과적입니다.

당신이 얼랑 자료를 사용하지 않을하고 SYS.CONFIG 파일이없는 경우

, 당신은 여전히, IMO, erl

에 가장 좋은 방법을 -config 명령 줄 매개 변수를 사용하여 구성 파일을 지정할 수 있습니다 응용 프로그램을 약간 수정해야합니다. 분산 형 기억 상실 테이블 (또는 다른 데이터베이스, 정말로, 당신이 쉽게 쿼리 할 수있는 한)에 매개 변수를 저장하는 것이 좋습니다. 그 다음에 application:get_env/2,3 호를 대체하여 사용자가 정의한 함수에 대한 호출로 바꾸십시오.이 함수는 설정을 저장하고있는 데이터베이스를 검사하여 application:get_env/2,3으로 되돌아갑니다. 예를 들어

:

-record(setting, {key, value}). 
get_setting(App, Key) -> 
    get_setting(App, Key, undefined). 

get_setting(App, Key, Default) -> 
    case mnesia:dirty_read(settings, {App, Key}) of 
     [] -> 
      application:get_env(App, Key, Default); 
     [_ = #setting{value = Value}] -> 
      Value 
    end. 
+0

네, 그런 세부적인 답변을 주셔서 감사합니다. 저에게 가장 적합한 것은 hiera에서 config 파일을 생성하고 BEAM을 시작하기 전에이 설정을 각 로컬 서버에 복사하는 것입니다. –