Как разрешить Chef TypeError: "неявное преобразование строки в целое число" с использованием node.normal?

В настоящее время я тестирую новую поваренную книгу шеф-повара для мониторинга Zabbix, и мой первый успешный "повар" использовал эту поваренную книгу. Однако я был вынужден внести изменения в один из атрибутов, потому что он будет меняться от сервера к серверу. Я решил использовать пакет данных, и у меня возникли трудности с получением и назначением атрибута.

Вот содержимое пакета данных:

    [user@workstation chef-repo]# knife data bag show zabbix_psk psk_syslog
    WARNING: Unencrypted data bag detected, ignoring any provided secret options.
    id:  psk_syslog
    psk: PSK 060

Я не назначил атрибут в файле атрибутов, а скорее в рецепте:default.rb

keyvalue = data_bag('zabbix_psk')
node.normal['zabbix_agentd']['psk_number'] = keyvalue['psk_syslog']['psk']

И тогда я назначаю это в шаблоне:

TLSPSKIdentity=<%= node['zabbix_agentd']['psk_number'] %>

Когда я пытаюсь Chef, я получаю следующую ошибку и дампа:

TypeError
---------
no implicit conversion of String into Integer

Cookbook Trace:
---------------
  /var/chef/cache/cookbooks/zabbix_agentd/recipes/default.rb:28:in `[]'
  /var/chef/cache/cookbooks/zabbix_agentd/recipes/default.rb:28:in `from_file'

Relevant File Content:
----------------------
/var/chef/cache/cookbooks/zabbix_agentd/recipes/default.rb:

 21:  # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 22:  # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 23:  # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 24:  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 25:  # THE SOFTWARE.
 26:
 27:  keyvalue = data_bag('zabbix_psk')
 28>> node.normal['zabbix_agentd']['psk_number'] = keyvalue['psk_syslog']['psk']
 29:
 30:  case node['platform']
 31:  when 'centos', 'redhat'
 32:    include_recipe 'zabbix_agentd::yum_repo'
 33:  end
 34:
 35:  package 'zabbix-agent'
 36:
 37:  directory node['zabbix_agentd']['log_dir'] do

System Info:
------------
chef_version=13.6.0
platform=centos
platform_version=7.4.1708
ruby=ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-linux]
program_name=chef-client worker: ppid=11127;start=14:18:48;
executable=/opt/chef/bin/chef-client


Running handlers:
[2017-12-14T14:18:56-06:00] ERROR: Running exception handlers
Running handlers complete
[2017-12-14T14:18:56-06:00] ERROR: Exception handlers complete
Chef Client failed. 0 resources updated in 07 seconds
[2017-12-14T14:18:56-06:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
[2017-12-14T14:18:56-06:00] FATAL: Please provide the contents of the stacktrace.out file if you file a bug report
[2017-12-14T14:18:56-06:00] ERROR: no implicit conversion of String into Integer
[2017-12-14T14:18:56-06:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)

Мне трудно понять, что не так с назначением node.normal в default.rb. Я новичок как в Chef, так и в Ruby, поэтому я очень ценю помощь. Я должен также отметить, что я не мог использовать метод get_databag_item; по-видимому, что метод не существует?

1 ответ

data_bag('zabbix_psk') возвращает массив имен предметов в сумке, а не данные во всех предметах. Ты хочешь data_bag_item('zabbix_psk', 'psk_syslog') вместо этого, а затем скорректируйте использование возвращаемого значения.

Другие вопросы по тегам