NoMethodError -------------- nil:NilClass 的未定义方法“[]”

NoMethodError ------------- undefined method `[]' for nil:NilClass

cache_path = Chef::Config[:file_cache_path]

puts "=========================="
test1 = ::File.join("#{cache_path}\#{node['ms_redistributable_2017_64']['windows_pkg']}")
puts test1

reboot 'restart_server' do
  action :nothing
  reason 'Reboot is necessary!'
end

remote_file ::File.join("#{cache_path}\#{rd_exe}") do
  source ::File.join("#{node['test-citrix-agents']['windows_source']}/#{node['ms_redistributable_2017_64']['windows_pkg']}")
  headers ({"username"=>"artifactory_username", "password"=>"artifactory_api_key"})
  checksum "#{node['ms_redistributable_2017_64']['checksum']}"
  action :create_if_missing
  not_if { ::File.exists?(::File.join("#{cache_path}\#{node['ms_redistributable_2017_64']['windows_pkg']}") }
end

几天来一直在编译!不知道这有什么问题。请救救我

不确定使用 node.default 为变量赋值是否有效。这通常在我们想要为配方中的节点变量设置值时使用。

示例:

node.default['my_cookbook']['var'] = 'somevalue'

而当你想将节点变量的值赋给另一个变量时:

dload_checksum = node['ms_redistributable_2017_64']['checksum']
rd_path = "C:\agents\#{node['ms_redistributable_2017_64']['windows_pkg']}"
dload_source = "#{node['test-citrix-agents']['windows_source']}/#{node['ms_redistributable_2017_64']['windows_pkg']}"

此外,在您的 remote_file 资源中,您可以使用上面定义的变量:

    checksum dload_checksum
    not_if { ::File.exists?(rd_path) }

更新:

除了堆栈跟踪之外,您能否使用 运行 期间显示的 Cookbook TraceRelevant File Content: 更新问题?

类似于:

Cookbook Trace: (most recent call first)
----------------------------------------
  C:/Chef/cache/cookbooks/cookbook1/recipes/default.rb:28:in `from_file'

Relevant File Content:
----------------------
C:/Chef/cache/cookbooks/cookbook1/recipes/default.rb:

 26:  end
 27:
 28>> node['cookbook1']['var'].each do |var|
 29:    file "c:/Users/Public/#{var}" do

问题终于解决了

  • 使用 Ruby 块来识别 nil class - 在这种情况下,存在从不同的食谱接收秘密的依赖性,看起来它正在生成一个空的 class 直到它通过仅添加那些必要的食谱来纠正
  • headers( "Authorization"=>"Basic #{ Base64.encode64("#{username}:#{password}").gsub("\n", "") }" ) Headers 用于解决问题 -> 使用硬编码用户 ID 和密码进行测试
  • kitchen yml 文件是主要因素,名称space 设置有很大差异。对于其中一个额外的行项目 space 尽管进行了所有上述更正
  • 仍导致 nomethod 错误