2017-10-07 8 views
0

에 사용 된 backend.key=<%= node['key']%> 소스에서 사용 된 템플릿 오류로 인해 쉘 아웃을 실행하는 동안 값이 없습니다.런타임에 노드 속성을 설정하고이를 셰프 템플릿에서 참조 할 수 없습니다.

Error : Chef::Mixin::Template::TemplateError - undefined method `[]' for nil:NilClass 

는 I 파일 cat /tmp/key.txt 및 노드 값 할당의 출력을 얻을 수있는 루비 블록을 갖는다.

루비 블록 :

ruby_block "Get_key" do 
    block do 
     #tricky way to load this Chef::Mixin::ShellOut utilities 
     Chef::Resource::RubyBlock.send(:include, Chef::Mixin::ShellOut)  
     command = 'cat /tmp/key.txt' 
     command_out = shell_out(command) 
     node.set['key'] = command_out.stdout 
    end 
    action :create 
end 

ERB :

backend.key=<%= node['key']%> 

답변

0

파일의 내용을 읽을 수 shell_out 할 필요가 없습니다. 대신 다음을 시도해보십시오.

ruby_block "Get_key" do 
    only_if { node['key'] == "" } 
    block do 
    node.set['key'] = File.read('/tmp/key.txt') 
    end 
end 

하지만 실제 문제는 다른 곳에서 생각합니다. 오류 메시지는 node이 템플릿 내에서 nil임을 나타내며 매우 드뭅니다.

그래서 내가 장님이고 게시 된 템플릿 줄에 오타가 있거나 오류를 숨기는 방식으로 코드 예제를 단순화했습니다. 나는

backend.key=<%= node['foo']['key']%> 

foo가 배열되지 않는 이상 같은 실제 템플릿 보이는 가정합니다. 그것을 확인하십시오.

+0

나는 꽤 비슷한 일을 [여기]를하고있는 중이 야 (https://github.com/TYPO3-cookbooks/gerrit/blob/fc82b9d82663f040116aed62bdcc3991e858ab98/recipes/peer_keys.rb) – StephenKing

0

이 패턴을 사용하지 마십시오. 그것은 천천히하고 공간과 RAM을 차지하고 당신이 인덱스를 슬프게 검색 노드 개체에 여분의 데이터를 넣습니다. 원하는 것은 다음과 같습니다.

template "whatever" do 
    # Other stuff ... 
    variables my_file: lazy { IO.read('/tmp/key.txt') } 
end 

이렇게하면 수렴 시간까지 읽기가 지연됩니다.

+0

안녕하세요, 난 당신의 접근 방식을 시도하고 아래의 값을 가지고 템플릿에서 : backend.key = # Aby

+0

나는 아래와 같이 템플릿을 변경했습니다 : 백엔드. key = <%= @key%> – Aby

+0

요리사 13을 사용하고 있습니까? 그렇지 않다면'변수 lazy {{key : IO.read (...)}}'가되어야합니다. – coderanger