В чем разница между этими двумя утверждениями в сценарии Chef?

Я использую Chef для установки пакетов. Я получаю сообщение об ошибке

node.default["installed_pkgs"] << 'amanda'


Undefined node attribute or method `<<' on `node'. To set an attribute, use `<<=value' instead.

Если я изменю это на:

node.default["installed_pkgs"] = 'amanda'

кажется, работает, или, по крайней мере, это не ошибка. Я взял это у кого-то, кто ушел, так что я не уверен в его коде, так как я не очень хорошо знаю Chef или Ruby.

2 ответа

Ваша проблема исходит от нее: https://github.com/chef/chef/blob/d8172e646d9fbf43e57bca5e20d0ac352ba9a66a/lib/chef/node/attribute_collections.rb#L175

узел не знает о << и думает, что это атрибут.

использование

node.default["installed_pkgs"] = 'amanda'

Разница в рубине.

<< это сокращение для добавления в конец массива. Если у вас есть массив и вы хотите добавить его в конец, вы должны использовать <<,

= это ванильное задание. Вы используете это для присвоения значения переменной или хешу, но вы должны быть уверены, что назначаемое вами значение подходит; если вы назначите скалярное значение, когда Ruby ожидает массив, то ваша программа выдаст ошибку.

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