2016-07-14 105 views
0

我有一个需要返回版本的厨师资源。我抬起头,资助将其作为节点属性发布的最佳方式。以下是资源代码(dj_artifactory_version):在厨师的自定义资源中创建节点属性/返回值

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 "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是一个双通系统,因此在资源操作发生之前调用正在进行。您可能需要完全重新考虑这些代码。 get_version应该可能是库辅助方法,而不是资源,但很难说没有看到其余的代码。

+0

它的工作。这只是一个关于汇编和编译时间问题的问题。由于我在收敛时间中设置节点属性,因此可以使用lazy {} – Scooby