chef-client 运行失败报 404 错误本质是节点在服务端无有效记录,主因包括 node_name 配置错误、validation.pem 缺失或权限不对、环境字段硬编码覆盖服务端设置、ohai 插件路径未配置或命名不规范。

chef-client 运行失败:找不到 node 名或报错 Net::HTTPServerException: 404 "Not Found"
这是 Chef 节点首次注册或重装后最常遇到的问题,本质是 chef-client 拿不到有效的 node 对象,服务端没它记录。
常见错误现象包括:ERROR: Failed to authenticate to https://your-server/organizations/org1 as chefadmin 或更直接的 404 "Not Found" —— 不是认证失败,而是 node 名在服务端根本不存在。
- 确保
/etc/chef/client.rb中配置了正确的node_name(如node_name "web01"),且该名未被其他节点占用 - 首次运行前,**不要**手动创建
/etc/chef/node.json;让chef-client -z或服务端自动初始化 - 若用
knife bootstrap,确认命令里指定了--node-name,且与client.rb一致;漏掉这个参数就会默认用 hostname,而 hostname 可能含域名、大小写不匹配或被防火墙截断 - 检查
/etc/chef/validation.pem是否存在且权限为600;404 有时是密钥无效导致服务端拒绝建立 node 记录
knife node list 返回空,但 chef-client 却说 node 已存在
这说明节点在服务端有记录,但状态异常(比如被手动删过 JSON 文件、或 run_list 损坏),导致 knife 查询时过滤掉了。
典型场景:运维人员直接登录 Chef Server 手动删了 /var/opt/opscode/data/bifrost/nodes/xxx.json,但没清理关联的索引数据。
- 执行
knife node show <node_name></node_name>看是否真能查到详情;如果返回 404,那确实是记录丢失 - 若
show成功但list不显示,大概率是 Solr 索引滞后;运行sudo opscode-ctl reindex(Chef Server 12+)或sudo chef-server-ctl reindex(14+)强制重建 -
knife node edit保存空修改可触发一次轻量同步,有时比重跑整个 reindex 更快见效 - 避免直接操作
/var/opt/opscode/data/下的文件;所有节点生命周期操作应走knife或 API
多个环境(env)下 chef-client 总应用 production 的 cookbook 版本
不是 cookbook 锁定问题,而是节点对象里 environment 字段没生效 —— 大多因为 client.rb 里写了 environment "production",覆盖了服务端设置。
TeemIp是一个免费、开源、基于WEB的IP地址管理(IPAM)工具,提供全面的IP管理功能。它允许您管理IPv4、IPv6和DNS空间:跟踪用户请求,发现和分配IP,管理您的IP计划、子网空间、区域和DNS记录,符合最佳的DDI实践。同时,TeemIp的配置管理数据库(CMDB)允许您管理您的IT库存并将您的配置项(CIs)与它们使用的IP关联起来。项目源代码位于https://github.com/TeemIP
这种硬编码会彻底绕过 Chef Server 的环境隔离机制,导致 dev/test 环境节点也拉取 production 的 cookbooks。
- 删掉
/etc/chef/client.rb中所有以environment开头的行;节点所属环境必须由服务端控制 - 确认节点已通过
knife node environment set <node><env></env></node>正确归属,而不是只改了run_list - 检查环境本身是否绑定了 cookbook 版本约束:用
knife environment show <env></env>看cookbook_versions和default_attributes是否符合预期 - 运行
chef-client -l debug观察日志里Using environment行,确认读取的是服务端下发值,而非 client.rb 回退值
自定义 ohai 插件不加载,ohai 命令能看到但 chef-client 里 node['myplugin'] 为空
Ohai 插件在 chef-client 启动初期就执行,但加载路径和时机比想象中严格:插件必须在 ohai_plugins_path 目录下,且文件名需匹配类名,否则静默忽略。
常见错误是把插件放到了 /etc/chef/ohai_plugins/,但 client.rb 没配 ohai_plugins_path,导致 chef-client 根本不扫描该目录。
- 在
/etc/chef/client.rb中明确添加ohai_plugins_path ["/etc/chef/ohai_plugins"](注意是数组) - 插件文件名必须全小写、下划线分隔,如
my_custom_data.rb;对应类名必须是Ohai::System::MyCustomData - 插件内必须调用
provides "my_custom_data",且属性赋值用data["my_custom_data"] = {...},不能用node或self - 验证方式:先运行
ohai -d /etc/chef/ohai_plugins my_custom_data看输出;再跑chef-client -z -l debug | grep my_custom_data确认是否出现在 node 数据初始化阶段
节点管理里最麻烦的从来不是命令怎么敲,而是“谁在什么时候改了什么配置”——client.rb、node 对象、环境定义、ohai 插件路径,四者稍有错位,表现出来的就是看似随机的 404 或空数据。留心每次变更后 knife node show 输出的 automatic_attributes 和 normal_attributes 差异,比看日志更快定位源头。









