Linux Chef 节点管理与配置实践

9次阅读

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

Linux Chef 节点管理与配置实践

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",覆盖了服务端设置。

这种硬编码会彻底绕过 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_versionsdefault_attributes 是否符合预期
  • 运行 chef-client -l debug 观察日志里 Using environment 行,确认读取的是服务端下发值,而非 client.rb 回退值

自定义 ohai 插件不加载,ohai 命令能看到但 chef-clientnode['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"] = {……},不能用 nodeself
  • 验证方式:先运行 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_attributesnormal_attributes 差异,比看日志更快定位源头。

text=ZqhQzanResources