Использование модифицированного opsworks развертывает ошибку неизменяемого объекта поваренной книги

Я пытаюсь добавить некоторый пользовательский код в кулинарную книгу развертывания opsworks, связанную с этапом before_migrate:

before_migrate do
  link_tempfiles_to_current_release
  deploy_version = Time.now.strftime("%Y%m%d%H%M%S")

  if node['deploy_app'] == 'web'
    link "/var/lib/tomcat#{node["tomcat"]["base_version"]}/webapps/ROOT###{deploy_version}" do
      to "#{release_path}"
    end

Проблема, с которой я сталкиваюсь, заключается в том, что когда я включаю кулинарную книгу развертывания в свой пакет site-cookbook, я получаю ошибку шеф-повара:

[2013-08-27T16:45:05+00:00] FATAL: Chef::Exceptions::ImmutableAttributeModification:   ruby_block[Compile Custom OpsWorks Run List] (opsworks_custom_cookbooks::execute line 3) had an error: Chef::Exceptions::ImmutableAttributeModification: Node attributes are read-only when you do not specify which precedence level to set. To set an attribute use code like `node.default["key"] = "value"'

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


person user2390053    schedule 27.08.2013    source источник


Ответы (2)


Начиная с Chef 11, атрибут должен указывать уровень приоритета. В Chef 10 вы можете сделать что-то вроде этого:

node['foo']['bar'] = 'my new value'

В Chef 11 вы должны указать уровень приоритета для этого значения:

node.set['foo']['bar'] = 'my new value'

Вы также можете использовать default и override (которые соответствуют уровням приоритета атрибутов):

node.default['foo']['bar'] = 'my new value'
node.override['foo']['bar'] = 'my new value'

Я подозреваю, что используемая вами кулинарная книга (или зависимая кулинарная книга) устанавливает данные для объекта node, используя устаревший синтаксис.

person sethvargo    schedule 03.01.2014
comment
node.set был удален, начиная с Chef 14. В последующих версиях вы должны явно установить уровень приоритета, например node.default. Подробности здесь. - person nofinator; 09.08.2019
comment
мертвая ссылка на уровни приоритета атрибутов: - person Sheng Jiang 蒋晟; 19.05.2020

В Chef атрибуты имеют несколько значений приоритета, наиболее часто используемые, вероятно, значения по умолчанию и переопределение. http://docs.opscode.com/chef_overview_attributes.html Вам нужно найти, где вы настраиваете атрибут, указав только node['что-то']. Кажется, его нет в коде, который вы вставили.

person wondra    schedule 09.10.2013