Ruby(Chef)无法将哈希数组传递到Chef资源中



我正在尝试创建一个将远程桌面服务部署到Windows服务器的配方,除了我创建的应用程序部署资源外,一切都按预期工作-这是一个简单的资源,但我在将要部署的应用程序传递为哈希数组时遇到了很多问题。

attributes\default.rb

default['app']['app_options'] = [{
app1:{
connection_broker: 'serv-01',
options: {
collectionname: 'Terminal Services', alias: 'Acrobat', displayname: 'Adobe Acrobat', filepath: 'C:\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\Acrobat.exe', filevirtualpath: 'C:\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\Acrobat.exe', ommandlinesetting: 'DoNotAllow', iconindex: 0, iconpath: '\\serv-01\C$\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\Acrobat.exe', usergroups: ['domain\group'], showinwebaccess: 1
}
},
app2:{
connection_broker: 'serv-01',
options: {
collectionname: 'Terminal Services', alias: 'Accounts', displayname: 'Accounts', foldername: 'Accounts', filepath: 'D:\Accounts\Accounts.bat', filevirtualpath: 'D:\Accounts\Accounts.bat', commandlinesetting: 'DoNotAllow', iconindex: 0, iconpath: 'C:\Windows\System32\cmd.exe', usergroups: ['domain\group'], showinwebaccess: 1
}
}
}]

配方\remote_desktop.rb

rdapps = node.read('app', 'app_options') || []
rdapps.each do |app|
remote_desktop_apps app['options']['alias'] do
action :create
connection_broker app['connection_broker']
app_options app['options']
end
end

resources\remote_desktop_apps.rb

resource_name :remote_desktop_apps
property :connection_broker, String,
desired_state: false
property :app_options, [String, Hash, Array],
desired_state: false
action :create do
app_options.each do |k,v|
script << "New-RDRemoteApp -ConnectionBroker "#{connection_broker}" {-#{k.to_s.capitalize} #{v}}.join(' ')}"
end
end

当在Test Kitchen中运行配方时,我得到以下错误:

================================================================================
Recipe Compile Error in C:/Users/ADMINI~1/AppData/Local/Temp/kitchen/cache/cookbooks/windows_/recipes/remote_desktop.rb
================================================================================
NoMethodError
-------------
undefined method `[]' for nil:NilClass

编辑

感谢@seshadri_c帮助我克服了第一道障碍,我遇到了另一个似乎与属性有关的问题。

这是厨房收敛的输出

================================================================================
Error executing action `create` on resource 'remote_desktop_apps[Acrobat]'
================================================================================
Chef::Exceptions::ValidationFailed
----------------------------------
name is a required property
Resource Declaration:
---------------------
# In C:/Users/ADMINI~1/AppData/Local/Temp/kitchen/cache/cookbooks/rh_windows/recipes/remote_desktop.rb
76:   remote_desktop_apps app['options']['alias'] do
77:     action :create
78:     connection_broker app['connection_broker']
79:     app_options app['options']
80:   end
81: end
Compiled Resource:
------------------
# Declared in C:/Users/ADMINI~1/AppData/Local/Temp/kitchen/cache/cookbooks/rh_windows/recipes/remote_desktop.rb:76:in `block in from_file'
remote_desktop_apps("Acrobat") do
action [:create]
default_guard_interpreter :default
declared_type :remote_desktop_apps
cookbook_name "windows_"
recipe_name "remote_desktop"
connection_broker "serv-01"
app_options {"collectionname"=>"Terminal Services", "alias"=>"Acrobat", "displayname"=>"Adobe Acrobat", "filepath"=>"C:\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\Acrobat.exe", "filevirtualpath"=>"C:\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\Acrobat.exe", "commandlinesetting"=>"DoNotAllow", "iconindex"=>"0", "iconpath"=>"\\serv-01\C$\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\Acrobat.exe", "usergroups"=>["domain\group"], "showinwebaccess"=>"1"}
end

然后在运行结束时出现以下消息:

FATAL: Chef::Exceptions::ValidationFailed: remote_desktop_apps[Acrobat] (rh_windows::remote_desktop line 76) had an error: Chef::Exceptions::ValidationFailed: name is a required property
$$$$$$ Exception calling "Read" with "3" argument(s): "Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection."
At line:100 char:11
$$$$$$ +       if ($fs.Read($bytes, 0, $fs.Length) -gt 0) {
$$$$$$ +           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ArgumentException

此错误的原因是哈希数组具有不同的键app1app2。因此,每次我们在rdapps上迭代时,我们都会得到一个不同的密钥。这样我们就不能得到像app['options']['alias']这样的子元素。

因此,您可以将属性调整为类似以下内容:

default['app']['app_options'] = [
{
connection_broker: 'serv-01',
options: {
collectionname: 'Terminal Services',
alias: 'Acrobat',
displayname: 'Adobe Acrobat',
filepath: 'C:\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\Acrobat.exe',
filevirtualpath: 'C:\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\Acrobat.exe',
ommandlinesetting: 'DoNotAllow',
iconindex: 0,
iconpath: '\\serv-01\C$\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\Acrobat.exe',
usergroups: ['domain\group'],
showinwebaccess: 1
}
},
{
connection_broker: 'serv-01',
options: {
collectionname: 'Terminal Services',
alias: 'Accounts',
displayname: 'Accounts',
foldername: 'Accounts',
filepath: 'D:\Accounts\Accounts.bat',
filevirtualpath: 'D:\Accounts\Accounts.bat',
commandlinesetting: 'DoNotAllow',
iconindex: 0,
iconpath: 'C:\Windows\System32\cmd.exe',
usergroups: ['domain\group'],
showinwebaccess: 1
}
}
]

然后我们可以像预期的那样工作:

rdapps = node.read('app', 'app_options') || []
rdapps.each do |app|
remote_desktop_apps app['options']['alias'] do
action :create
connection_broker app['connection_broker']
app_options app['options']
end
end

最新更新