Chef 11.10实例扩容后启动失败,报NoMethodError: undefined method 'property'
这个错误的根源很明确:你使用的Chef 11.10版本不支持property语法——property是Chef 12及以上版本才引入的资源定义方式,而你当前用到的windows cookbook里的auto_run.rb用了这个新语法,导致在老版本Chef上运行时直接抛出undefined method 'property'的异常。
结合你无法SSH连接实例的情况,可以尝试以下几种解决方案:
锁定windows cookbook的兼容版本
在你的Berksfile中指定一个适配Chef 11.x的windows cookbook版本,比如v1.39.0(这个版本及之前的版本使用的是Chef 11支持的attribute语法):cookbook 'windows', '~> 1.39.0'之后重新通过Berkshelf打包并上传cookbooks到OpsWorks,再尝试启动实例。
升级OpsWorks的Chef版本(如果环境允许)
如果你的OpsWorks控制台支持调整Chef版本,可以把实例使用的Chef版本升级到12.x或更高。这样就能原生支持property语法,不需要修改现有cookbook。不过升级前要确认其他在用的cookbooks也能兼容新的Chef版本。修改cookbook资源定义(若有权限编辑cookbook)
如果你能修改windows cookbook的auto_run.rb文件,把所有的property替换为Chef 11支持的attribute,同时把name_property: true改成name_attribute: true,修改后的关键代码行应该是这样:attribute :program_name, String, name_attribute: true attribute :path, String, coerce: proc { |x| x.tr('/', '\') } attribute :args, String attribute :root, Symbol, equal_to: %i(machine user), default: :machine修改完成后重新打包上传cookbooks即可。
这几个方案里,锁定兼容版本是最稳妥的选择,不会对现有配置造成额外影响。
内容的提问来源于stack exchange,提问作者alyx

