2016-07-14 2 views
0

버전을 반환해야하는 요리사 리소스가 있습니다. 내가 노드 속성으로 게시하는 최선의 방법을 찾아 보았습니다.노드 속성 만들기/요리사 사용자 정의 리소스의 값 반환

require "open-uri" 
require "json" 


def whyrun_supported? 
    true 
end 

def get_version(name, user, pass, type, organization, art_module, repos, version) 
    if (type.match(/snapshot$/i) and version.match(/latest$/i)) 
    string_object = open("https://artifactory.io/artifactory/api/search/versions?g=#{organization}&v=*.*.*&a=#{art_module}&repos=#{repos}", :http_basic_authentication=>["#{user}", "#{pass}"], :ssl_verify_mode=>OpenSSL::SSL::VERIFY_NONE) 
    json_file = JSON.parse(string_object.read) 
    version_array = Array.new 
    json_file["results"].each do |version| 
     version_array.push(version["version"]) 
    end 
    unique_versions=(version_array.uniq).max 
    node.set['artifact']['snapshot']['latest'] = unique_versions 

가 지금은 버전 얻기 위해 내 조리법이 요리사 리소스를 사용 : 다음은 자원 코드 (dj_artifactory_version)입니다

dj_artifactory_version "test" do 
    type "snapshot" # options - snapshot/release 
    organization "djcm.billing.api.admin" # layout.organization in artifactory properties. 
    modules "paypal" # layout.properties in artifactory properties. 
    repos "djcm-zip-local" # repository name in artifactory 
    version "latest" #latest/oldest 
end 

p "#node{['artifact']['snapshot']['latest']}" 

내가 기본을 만듭니다 [ '유물'] [ '스냅 샷'] [ 'latest'] default.rb에 값이 있지만 여기에도 레서피를 실행 한 후에도 이전 값은 변경되지 않습니다. 흥미롭게도 리소스에서 동일한 내용을 인쇄하면 노드에 새 값이 인쇄됩니다.

내가 뭘 잘못하고 있으며 자신의 리소스를 사용하여 가치를 게시하는 더 좋은 방법이 있습니까?

답변

1

요리사 리소스에는 반환 값이나 출력 값이 없습니다. 좀더 구체적으로 말하자면, Chef는 two-pass 시스템이므로 리소스 작업이 발생하기 전에 p 콜이 발생하고 있습니다. 이 코드를 완전히 재고 할 필요가있을 것입니다. get_version은 아마도 리소스가 아닌 라이브러리 도우미 메서드 여야하지만 나머지 코드는 보지 않고 말하기가 어렵습니다.

+0

효과가 있습니다. 그것은 converge vs compile time 문제에 불과했습니다. 노드 속성을 수렴 시간에 설정 했으므로 지연 {}을 사용하여 액세스 할 수 있습니다. – Scooby