簡體   English   中英

Ruby (Chef) 無法將 hash 數組傳遞到 Chef 資源中

[英]Ruby (Chef) Unable to pass a hash array into a Chef resource

我正在嘗試創建一個將遠程桌面服務部署到 Windows 服務器的方法,除了我創建的應用程序部署資源之外,一切都按預期工作 - 這是一個簡單的資源,但我在傳遞要部署的應用程序時遇到了很多問題作為 hash 數組。

屬性\默認.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

資源\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 幫助我克服了第一個障礙,我遇到了另一個似乎與屬性相關的問題。

這是廚房匯聚的output

================================================================================
       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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM