在自定义资源中为chef

时间:2016-07-14 13:36:47

标签: ruby-on-rails ruby ruby-on-rails-3 chef chef-recipe

我有一个需要返回版本的厨师资源。我查找并资助了将其作为节点属性发布的最佳方式。这是资源代码(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']}"

我在default.rb中使用值创建默认[' artifact'] [' snapshot'] ['最新'],但即使我运行了配方旧的价值不会改变。有趣的是,当我在我的资源中打印相同内容时,它会使用新值打印节点。

我做错了什么,是否有更好的方法使用您自己的资源发布值?

1 个答案:

答案 0 :(得分:1)

Chef资源没有返回值或输出值。您更具体地遇到的问题是Chef是一个双程系统,因此在资源操作发生之前发生了p调用。您可能需要完全重新考虑此代码。 get_version应该是一个库助手方法,而不是资源,但是如果不看其余的代码就很难说。