使用Kitchen CI运行Cookbook失败:NoMethodError报错求助
这个报错的核心原因是Nginx Cookbook的属性没有被Chef加载——虽然你已经通过berks vendor把它下载到本地了,但Chef并不会自动加载所有vendor的cookbook属性,必须明确告知Chef要引入这个cookbook的内容。下面是具体的排查和解决步骤:
1. 先检查Cookbook依赖声明
首先要确保你的redmine_test Cookbook的metadata.rb文件里,已经明确声明了对nginx cookbook的依赖:
depends 'nginx', '~> 2.7.6'
这一步是基础:Chef会根据metadata里的依赖关系,自动处理对应cookbook的属性和资源加载。哪怕你用Berkshelf下载了cookbook,没有这个声明,Chef也不会主动去加载它的属性。
2. 让Nginx Cookbook的属性被加载
有两种可靠的方式可以让Chef加载Nginx的属性:
方式一:在Run List中直接包含Nginx的默认Recipe
修改kitchen.yml里的suites配置,把nginx的recipe加到run_list最前面:suites: - name: default data_bags_path: "../../data_bags" encrypted_data_bag_secret_key_path: "../../data_bags/secrets/bitbucket.json" run_list: - recipe[nginx] - recipe[redmine_test]这样Nginx的默认Recipe会先执行,它会自动设置好
node['nginx']['group']等核心属性。方式二:在redmine_test的Recipe中显式引入Nginx属性
如果你不需要执行Nginx的Recipe,只是需要它的属性值,可以在redmine_test/recipes/default.rb的开头添加:include_attribute 'nginx'这会让Chef直接加载Nginx Cookbook的属性文件,
node['nginx']['group']就会有对应的默认值了。
3. 验证修改效果
完成上述修改后,重新执行命令测试:
berks vendor kitchen destroy && kitchen create && kitchen converge -l debug
你可以在debug日志里搜索nginx相关内容,如果看到类似Loading attributes from nginx的日志,就说明属性已经被正确加载了。
额外排查点(如果上述步骤无效)
- 确认
berks vendor是否把nginx cookbook放到了正确的目录(默认是berks-cookbooks),Kitchen CI是否能识别到这个目录; - 检查nginx cookbook 2.7.6版本的
attributes/default.rb,确认里面确实定义了default['nginx']['group'](该版本默认值是nginx,应该是存在的)。
内容的提问来源于stack exchange,提问作者a-dawg

