独立Chef服务器运行chef-client报CookbookNotFound错误求助
pilot_sec_update Cookbook的实用方案 这种找不到Cookbook的坑我踩过好多次,别慌,咱们一步步排查,大概率能解决:
1. 先确认Cookbook真的在Chef服务器上“安家”了
别光相信上传命令的输出,咱们实打实验证一下。在本地或者Chef服务器上跑这条命令:
knife cookbook list | grep pilot_sec_update
如果啥都没出来,说明之前的上传大概率失败了,重新传一遍,记得加--force覆盖可能存在的旧版本:
knife cookbook upload pilot_sec_update --force
2. 核对运行列表里的Cookbook名称——大小写、下划线一个都不能错!
Chef对Cookbook名称的大小写是严格敏感的!比如你上传的是pilot_sec_update,但运行列表里写成Pilot_Sec_Update,那肯定找不到。用这条命令看节点的运行列表:
knife node show <你的节点名> -l | grep run_list
仔细核对名称,确保和你上传的完全一致,包括下划线、大小写这些细节。
3. 检查版本是否“对上号”了
有时候你上传的Cookbook版本,要么和节点的Chef客户端不兼容,要么被节点所属环境的版本限制给挡住了。先看看服务器上的Cookbook版本:
knife cookbook show pilot_sec_update
如果用了Chef环境,再检查环境的版本约束:
knife environment show <你的环境名> -l | grep cookbooks
要是有版本限制,要么调整环境的约束规则,要么上传符合要求的版本,或者直接在运行列表里指定具体版本:
knife node run_list add <节点名> 'recipe[pilot_sec_update::default@1.0.0]'
4. 清理节点的Chef缓存——有时候就是缓存搞的鬼
节点上的Chef客户端会缓存Cookbook,旧缓存可能会“认不出”新上传的Cookbook。手动清一下缓存试试:
sudo rm -rf /var/chef/cache/cookbooks/pilot_sec_update sudo rm -rf /var/chef/cache/checksums
清完再跑sudo chef-client,说不定就好了。
5. 确认节点能正常连到Chef服务器
如果节点和服务器之间网络不通,或者客户端配置错了,那肯定拉不到Cookbook。在节点上测试下连接:
curl -v https://<你的Chef服务器IP>/organizations/<你的组织名>/cookbooks/pilot_sec_update
要是返回404,说明服务器上确实没这个Cookbook;要是返回200但客户端还是报错,就得检查/etc/chef/client.rb里的chef_server_url、validation_client_name这些配置是不是写错了。
6. 检查Cookbook的metadata.rb——别在根源上出错
有时候Cookbook的metadata.rb里的名称写错了,上传后服务器根本识别不了。打开本地的pilot_sec_update/metadata.rb,确认第一行的name字段是:
name 'pilot_sec_update'
要是写错了,改完重新上传Cookbook就行。
内容的提问来源于stack exchange,提问作者Barak

