2017-01-20 13 views
0

Mapr 클라이언트 설치 상황이 있습니다. /opt/mapr/hive/hive-x.y/conf/dir 아래에있는 사용자 정의 된 hive-site.xml 파일을 복사 할 수 있기를 원합니다. 문제는 패키지 (하이브 포함)가 완전히 설치 될 때까지 하이브 버전 번호를 알 수 없다는 것입니다. 그래서, 다음과 같은 코드가 실패 :요리사 : 가변 인수에 대한 게으른 평가

템플릿 이름이 너무 이름이 /conf/hive-site.xml 대신 /opt/mapr/hive/hive-1.2/conf/site.xml로 평가 받고있다 완료되지 않은 설치 패키지를 지적되는 컴파일 시간에 평가하기 않은 것 같습니다
package 'mapr-client' 
... 
... 
dir_hive = Dir["/opt/mapr/hive/hive-*"] 
template "#{dir_hive[0]}/conf/hive-site.xml" do 
    source "devg_hive-site.xml.erb" 
    mode 0644 
end 

. 우리는 모든 패키지가 완전히 설치하기 위해 별도의 호출을 기다리거나 다음 코드를 수동으로 실행 할 경우 는 :

dir_hive = Dir["/opt/mapr/hive/hive-*"] 
template "#{dir_hive[0]}/conf/hive-site.xml" do 
    source "devg_hive-site.xml.erb" 
    mode 0644 
end 

우리는 설정 파일의 성공적인 복사본이; 그러나 설치하고 구성하려고하는 프로세스의 일부인 경우에는 작동하지 않습니다. 다음은 우리가 시도한 몇 가지 다른 것들입니다 :

  • 코드의 구성 복사 부분을 별도의 레시피로 이동하고 실행 목록을 만들려고했는데 실행 순서가 유지되면 패키지 설치가 완료되면 하이브 디렉토리를 사용할 수 있으므로 올바른 파일 경로를 갖게됩니다. 그것은 작동하지 않았다.
  • ruby_block, lazy evluator only_if (/ opt/mpar/hive 디렉토리 확인) 등에 config 복사 코드를 넣습니다.
  • /tmp/dir에 소스 xml 파일을 복사하면/opt/mapr/hive 디렉토리를 사용할 수있을 때 파일을 복사하려고 시도했지만 lazy evaluator, ruby_block 등을 사용하면 다시 실패합니다.
  • Ruby_block의 루프를 통해 시도하여 if !Dir.glob('/opt/mapr/hive/hive-*/conf/hive-site.xml').empty?을 확인하고 5 초 동안 수면을 시도했습니다. 실패.

위의 변경 사항 중 일부는 성공적이지 못했습니다. 이 모든 경우에 "#{dir_hive[0]}/conf/hive-site.xml"이 컴파일 타임에 평가되어 잘못된 파일 경로를 생성하는 것으로 나타납니다.

와일드 카드 문자를 사용하여 설치된 파일 경로를 캡처 한 다음 해당 경로를 일부 작업 (예 : 사용자 정의 파일로 바꾸기)으로 사용하는 가장 좋은 방법은 무엇입니까?

또는 어떤 동작이 수행되고 지연된 평가 된 변수 이름이 동작 후에 존재하는 파일 이름에 따라 달라지는 경우 표현식을 지연 평가하여 변수 이름을 생성 할 수 있습니까?

시간을 내 주셔서 감사합니다.

답변

1

매우 '냄새 나는'것이므로 업그레이 드에서 아마도 당신을 물 것입니다. 최신 버전은 더 높은 번호를 갖기 때문입니다. 따라서 first 대신 last을 사용해보세요.

template "hive-site.xml" do 
    path lazy { "#{Dir['/opt/mapr/hive/hive-*'].last}/conf/hive-site.xml" } 
    source "devg_hive-site.xml.erb" 
end 

나는이 코드에서 얼마나 공통 모르겠어요,하지만 당신은 자원/패키지 (메타 데이터 또는 목록 파일)에서 경로를 추출하는 코드에 대해 생각할 수 있습니다.

EDIT. 나는 두 번째 생각을했습니다. 패키지가 node["packages"]에 기록 될 수 있습니다. 버전을 경로에 매핑하여 사용할 수 있으며 Dir (아직 게으른 블록이 필요함) 패키지를 설치 한 후 node["packages"]을 새로 고치려면 ohai 플러그인을 실행해야 할 수도 있습니다. 이에 대한 알림을 사용할 수 있음).

은 다음과 유사 할 수 있습니다

ohai "reload packages" do 
    plugin "packages" 
    action :nothing 
end 

package "mapr-client" do 
    notifies :reload, "ohai[reload packages]", :immediately 
end 

template "hive-site.xml" do 
    path lazy { "/opr/mapr/hive/hive-#{node["packages"]["mapr-client"]["version"]}/conf/hive-site.xml" } 
    source "devg_hive-site.xml.erb" 
end 

불행하게도 버전은 아마 디렉토리 구조에 매핑되지 않습니다

. 이 패키지는 ;-)

+0

정확하게 코드 아래에 무엇을하고있다가 필요합니다 , 고맙습니다! 패키지 버전 관리 형식에 동의합니다. 각 패키지마다 다르며 향후 변경해야하므로 스크립트가 실패합니다. –

0
ohai "reload packages" do 
    plugin "packages" 
    action :nothing 
end 

package "mapr-hive" do 
    notifies :reload, "ohai[reload packages]", :immediately 
end 

template "hive-site.xml" do 
    path lazy { "/opr/mapr/hive/hive-#{node["packages"]["mapr-hive"]["version"]}/conf/hive-site.xml" } 
    source "devg_hive-site.xml.erb" 
end 

단지 나쁜 그러나 버전은 1.2.201611292220-1을주고있다하지만 우리는 1.2 만

이 도움이

ohai "reload packages" do 
    plugin "packages" 
    action :nothing 
end 

package "mapr-hive" do 
    notifies :reload, "ohai[reload packages]", :immediately 
end 
+0

버전 1.2.201611292220-1 [/ \ A (\ d + \. \ d +) /, 1]'을 쉽게 추출 할 수 있습니다. ohai reload에 대해서는 [패키지 (https://github.com/chef/ohai/blob/master/)에 대해서만 노드 속성을 업데이트합니다 (https://docs.chef.io/resource_ohai.html)). lib/ohai/plugins/packages.rb) 플러그인을 사용하십시오. 패키지 리소스가 변경 될 때만 업데이트가 실행되고 (ohai reload 리소스가 통지됩니다), 패키지 설치의 경우 각 chef-client 실행과 함께 실행되지 않습니다. –