CINC Client 19.4.46 与 Workstation 26.3.0 配置参数详解

CINC 双版本线配置体系详解:节点端 /etc/cinc/client.rb 与 client.d 片段、solo.rb 本地模式,工作站端 config.rb/knife.rb 与 ~/.cinc/credentials 凭据优先级实测(knife 19.3.3),逐项参数对照 CLI 旗标并附生产模板

CINCCINCChef配置管理基础设施即代码DevOps2026/10/27

CINC Client 19.4.46 与 Workstation 26.3.0 配置参数详解

目标:讲清 CINC 双版本线的全部配置文件体系——节点侧(Cinc Client 19.4.46)的 /etc/cinc/client.rb、client.d 片段目录与本地模式 solo.rb,工作站侧(Cinc Workstation 26.3.0 / knife 19.3.3)的 config.rb/knife.rb 与 ~/.cinc/credentials 凭据文件;逐项参数含义、加载优先级与查看/修改方式均给出实测回显。全文于 2026-10-27 在 Ubuntu 22.04 真实节点与工作站实测通过。

一、环境信息

  • 节点侧:Cinc Client 19.4.46(内置 Ohai 19.1.40),配置根目录 /etc/cinc,运行缓存 /var/cinc/cache
  • 工作站侧:Cinc Workstation 26.3.0(内置 knife 19.3.3、cinc-cli 6.1.40),配置位置 ~/.cinc/credentials 与 <仓库>/.chef/config.rb(旧名 knife.rb)
  • 机器规划:node01.cinc.lab(被管节点,装 Client)、ws01.cinc.lab(管理工作站,装 Workstation)
  • 双版本线说明:CINC 各产品线版本号独立演进——Client 走 19.x 线、Workstation 走 26.x 线(Ohai 也有自己的 19.1.x 线)。本文 client.rb/solo.rb 属 Client 19.4.46 线,config.rb/knife.rb/credentials 属 Workstation 26.3.0 线;一篇覆盖两侧,是因为「节点收敛 + 工作站下发」必须成对配置才有意义。

二、前置条件

三、参数查看与修改方式

CINC 的配置文件(client.rb / solo.rb / config.rb / knife.rb)全部是 Ruby DSL:每行一条 参数名 "值" 赋值,注释用 #。唯一例外是工作站的 ~/.cinc/credentials,它是 INI 格式(按 profile 分节)。

四种查看/修改手段:

  1. 直接编辑配置文件(主要方式):改完下次运行生效,无热重载概念;
  2. 命令行临时覆盖:cinc-client / cinc-solo / knife 都支持 --config-option OPTION=VALUE 覆盖单项配置,只影响当次运行、不改文件(各自 --help 实测均可见该选项);
  3. knife 查看生效值:工作站侧 knife config list(看 profile 列表)、knife config show [OPTION...](看实际加载源与生效值),实测回显见 7.2;
  4. cinc-client 查看生效值:无独立的 "config show" 子命令,以启动日志为准——收敛开头会打印所用平台、Run List 与 Cookbook 加载情况(安装篇 8.3 回显即为样例)。

⚠️ 注意:cinc-client 另有 --disable-config 选项("Refuse to load a config file and use defaults"),help 中官方明示 "This is for development and not a stable API"——仅调试用,生产勿依赖。

四、参数总览:配置文件地图

配置文件所属侧格式用途
/etc/cinc/client.rb节点(Client 19.4.46)Ruby DSLclient/server 模式主配置
/etc/cinc/client.d/*.rb节点Ruby DSL片段配置,按文件名字典序并入主配置
solo.rb(路径自定,-c 指定)节点Ruby DSL本地模式(cinc-solo / cinc-client --local-mode)
<chef-repo>/.chef/config.rb工作站(Workstation 26.3.0)Ruby DSLknife 主配置(19 起新名;旧名 knife.rb 仍兼容)
~/.cinc/credentials工作站INI多 profile 凭据(knife 19 推荐方式)
/etc/cinc/ohai/节点Ruby/JSONOhai 自定义插件与 hints

生效优先级:

  • 节点侧:命令行 --config-option > client.d 片段(字典序后者覆盖前者)> client.rb > 内置默认值;
  • 工作站侧:命令行旗标 / --config-option > ~/.cinc/credentials 当前 profile > config.rb/knife.rb。实测 knife config show 首行打印 Loading from credentials file /root/.cinc/credentials——credentials 是实际加载源(见 7.2)。

五、/etc/cinc 配置根目录与 client.rb 详解

5.1 根目录骨架

deb 安装后自动生成骨架,node01 实测:

drwxr-xr-x 2 root root 4096 Oct 27 09:08 accepted_licenses
-rw-r--r-- 1 root root   36 Oct 27 09:13 cinc_guid
drwxr-xr-x 2 root root 4096 Oct 27 09:08 client.d
-rw-r--r-- 1 root root  169 Oct 27 09:13 client.rb
-rw-r--r-- 1 root root 1679 Oct 27 09:13 node01.pem
drwxr-xr-x 3 root root 4096 Oct 27 09:08 ohai
drwxr-xr-x 2 root root 4096 Oct 27 09:08 trusted_certs

各项含义:

  • client.rb:主配置文件(5.2 起详解);
  • client.d/:片段配置目录,出厂为空(见 6.1);
  • trusted_certs/:服务端自签证书信任区,把 PEM 拷入即被信任(见 5.6);
  • ohai/:Ohai 自定义插件与 hints(见 5.6);
  • accepted_licenses/:chef_license "accept" 接受许可后的落盘标记;
  • cinc_guid:节点级随机 GUID,安装时生成;
  • node01.pem:本节点在服务端的 client 私钥(client/server 模式注册后才有,本例由 knife 注册流程生成)。

出厂 client.rb 骨架(deb 自带、未改动前的原始内容,逐行照抄):

# The client.rb file specifies how Chef Infra Client is configured on a node
# See https://docs.chef.io/config_rb_client/ for detailed configuration options
#
# Minimal example configuration:
# node_name  "THIS_NODE_NAME"
# chef_server_url  "https://CHEF.MYCOMPANY.COM/organizations/MY_CHEF_ORG"
# chef_license  "accept"

出厂只有注释与三行最小示例。注意第二行官方注释给出了完整参数清单的权威出处 docs.chef.io/config_rb_client/——CINC 与上游配置项完全一致,本文只讲实测验证过与生产常用的参数。

5.2 身份与接入参数

node01 实际生效的 client.rb(逐行照抄):

node_name       "node01"
client_key      "/etc/cinc/node01.pem"
chef_server_url "http://ws01.cinc.lab:8889"
cookbook_path   ["/root/cookbooks"]
chef_license    "accept"

逐项详解:

参数类型/默认说明对应 CLI
node_name字符串;默认节点 FQDN节点在服务端的唯一名,即注册身份-N, --node-name
client_key路径;默认 /etc/cinc/client.pem节点私钥(PEM),与服务端记录的公钥配对鉴权-k, --client_key
chef_server_urlURL服务端地址;正式服务端带组织,形如 https://server/organizations/ORG;本例指向零服务端模式端点 http://ws01.cinc.lab:8889-S, --server
validation_key路径新节点自助注册用的 validation 私钥,注册成功后应删除-K, --validation_key
chef_license字符串许可接受标记;CINC 无 EULA,但上游代码内置的许可确认机制仍在,填 "accept" 避免运行时提示--chef-license

⚠️ client_key 是私钥:权限必须 0600、属 root;泄露等于节点身份泄露。纳入备份、禁止入库到 git。

5.3 运行与路径参数

参数说明对应 CLI
cookbook_pathCookbook 搜索目录(数组);本地模式必配—
node_path本地模式下节点 JSON 落盘目录(见 6.2)—
environment节点所属环境,默认 _default-E, --environment
json_attribs从 JSON 文件或 URL 注入节点属性-j, --json-attributes
file_cache_path运行缓存根目录,默认 /var/cinc/cache(实测 cinc-apply 异常栈转储落点为 /var/cinc/cache/cinc-stacktrace.out)—
minimal_ohai只跑收敛必需的 Ohai 插件,缩短启动--minimal-ohai
lockfile收敛锁文件位置,防多个收敛进程并发--lockfile
run_lock_timeout等待另一收敛进程释放锁的最大秒数,默认无限等--run-lock-timeout

💡 技术拓展:「环境(environment)」在配置管理里是发布分级概念——同一 Cookbook 可按环境钉不同版本(如 staging 用新版试水、production 钉稳定版)。主流方案对比:Chef/CINC 用服务端 environment 对象;Ansible 靠 inventory 分组加变量;Puppet 用 directory environments。节点侧由 environment 参数或 -E 指定,未指定一律 _default(knife node show 实测回显 Environment: _default)。

5.4 日志与输出参数

参数取值说明对应 CLI
log_level:auto/:trace/:debug/:info/:warn/:error/:fatal默认 :auto(终端 info、写文件 warn)-l, --log_level
log_locationSTDOUT 或文件路径定时托管/守护化运行建议写文件-L, --logfile
colortrue/false彩色输出,默认开--[no-]color
force_formatter / force_logger布尔人类可读格式化输出 vs 纯日志流--force-formatter / --force-logger
always_dump_stacktrace布尔任何日志级别都转储异常栈--[no-]always-dump-stacktrace

实测提示:默认 info 级日志常见一行 ERROR: shard_seed: Failed to get dmi property serial_number: is dmidecode installed?——这不是故障,是 Ohai 采集 DMI 信息时系统缺 dmidecode 的提示,仅影响 shard_seed 派生属性(用于按节点分片随机化定时任务),装 dmidecode 即可消除。

5.5 调度参数(周期收敛)

cinc-client 自带 -i/--interval SECONDS 周期运行与 -s/--splay SECONDS 随机抖动(防止全体节点同时打服务端),对应配置项 interval、splay;--once 则取消周期只跑一次。但官方推荐的持续收敛方式是 systemd timer 或 cron 外部调度(deb 包不附带 systemd 单元,安装篇 8.5 已实测 timer 闭环)。内部 interval 与外部 timer 二者择一,不要双层调度叠加。

5.6 Ohai 目录与 trusted_certs

  • /etc/cinc/ohai/:放自定义 Ohai 插件(Ruby)与 hints(JSON,例如 hint 告知某云厂商元数据端点可达性);cinc-client 每次收敛前自动加载。
  • /etc/cinc/trusted_certs/:服务端使用自签证书时,把 CA/服务证书 PEM 拷入此目录即被 client 信任,无需改动校验级别。
  • ssl_verify_mode::verify_peer(默认,严格校验)/ :verify_none(仅调试,生产禁用)。
  • fips:对应 --[no-]fips,合规场景启用 FIPS 模式。

六、client.d 片段与 solo.rb(本地模式)

6.1 client.d 片段配置

client.d/*.rb 中每个文件都是合法 Ruby DSL 片段,启动时按文件名字典序合并进主配置,后加载者覆盖先加载者。适合「分文件治理」:如 00-base.rb(公共项)、10-logging.rb(日志项)、90-local.rb(本机特例),由不同配置分发通道各自下发。实测出厂为空目录:

/etc/cinc/client.d/:
total 8
drwxr-xr-x 2 root root 4096 Oct 27 09:08 .
drwxr-xr-x 6 root root 4096 Oct 27 09:08 ..

6.2 solo.rb 本地模式配置

cinc-solo 与 cinc-client --local-mode 不读 client.rb,而是用 -c 显式指定的配置文件(惯例命名 solo.rb)。node01 实测配置:

cookbook_path ["/root/cookbooks"]
node_path     "/root/nodes"
log_level     :info
log_location  STDOUT

逐项:cookbook_path 指向 Cookbook 搜索目录(数组,可多个);node_path 为节点 JSON 落盘目录,收敛后每个节点生成一个 <节点名>.json(实测生成 /root/nodes/node01.cinc.lab.json);log_level/log_location 同 5.4。

⚠️ 实测细节:带 -o 覆盖 Run List 的运行会跳过节点 JSON 的最终保存,日志原文 WARN: Skipping final node save because override_runlist was given——此时该 JSON 可能只有 {"name": "node01.cinc.lab"} 一行,属设计行为而非异常。

七、工作站配置:config.rb / knife.rb / credentials

7.1 config.rb 与 knife.rb

knife 19(Workstation 26.3.0 内置 19.3.3)把主配置文件从 knife.rb 更名为 config.rb,发现路径为 <chef-repo>/.chef/ 与 ~/.chef/。实测 chef-repo 下两文件同内容并存(各 262 字节),旧名仍被兼容识别;但显式 -c 指向不存在的 knife.rb 会直接报错,实测回显:

ERROR: CONFIGURATION ERROR:Specified config file /root/chef-repo/.chef/knife.rb does not exist

实测生效的 config.rb(/root/chef-repo/.chef/config.rb,逐行照抄):

current_dir = File.dirname(__FILE__)
node_name                "admin"
client_key               "#{current_dir}/admin.pem"
chef_server_url          "http://127.0.0.1:8889"
cookbook_path            ["#{current_dir}/../cookbooks"]
chef_license             "accept"

逐项:首行取配置文件所在目录为基准,后续路径全部相对它展开——整个 .chef 目录换机器搬运时无需改路径;node_name/client_key 是工作站用户在服务端的身份与私钥(演示用户 admin,工作站服务端账号密码按本站示例规范 q1w2e3r4);chef_server_url 指向服务端;cookbook_path 指向仓库内 cookbooks 目录。

7.2 ~/.cinc/credentials(INI profile,knife 19 推荐)

knife 19 起推荐用 INI 凭据文件统一管理服务端身份,支持多 profile。实测 ~/.cinc/credentials:

[default]
node_name = "admin"
client_key = "/root/chef-repo/.chef/admin.pem"
chef_server_url = "http://127.0.0.1:8889"
cookbook_path = ["/root/chef-repo/cookbooks"]

查看已配置 profile(knife config list 实测回显):

 Profile  Client  Key                          Server                
------------------------------------------------------------------
*default  admin   ~/chef-repo/.chef/admin.pem  http://127.0.0.1:8889 

查看生效值(knife config show node_name chef_server_url cookbook_path 实测回显):

Loading from credentials file /root/.cinc/credentials
chef_server_url: http://127.0.0.1:8889
cookbook_path:   /root/chef-repo/cookbooks
node_name:       admin

首行 Loading from credentials file ... 是关键:credentials 优先于 config.rb/knife.rb 成为实际加载源。多 profile 时在文件中追加 [staging] 等段落,用 knife --profile staging 或 knife config use staging 切换。

⚠️ 注意:credentials 与 config.rb 并存且取值不一致时以 credentials 为准——排障先跑 knife config show 看「Loading from」行确认实际来源,避免改错文件。

八、生产配置模板

三套模板,适用场景:中小规模(数十~数百节点)、无专职配置管理团队、允许内网离线分发。

8.1 节点 client.rb 模板(client/server 模式)

node_name       "web01.prod.internal"
client_key      "/etc/cinc/client.pem"
chef_server_url "https://cinc-server.internal/organizations/prod"
chef_license    "accept"
environment     "production"
log_level       :info
log_location    "/var/log/cinc-client.log"
ssl_verify_mode :verify_peer
run_lock_timeout 1800

要点:定时托管时日志落文件便于审计;run_lock_timeout 防上一次收敛卡死导致无限等待;模板中主机名、域名、组织名按实际环境替换。

8.2 节点 solo.rb 模板(本地模式,无服务端)

cookbook_path ["/srv/chef/cookbooks"]
node_path     "/srv/chef/nodes"
log_level     :info
log_location  "/var/log/cinc-solo.log"

要点:Cookbook 用 git 下发到 /srv/chef/cookbooks,配合 systemd timer 周期执行 cinc-solo -c /srv/chef/solo.rb -o web_base,即构成无服务端持续收敛(timer 单元写法见安装篇 8.5)。

8.3 工作站 credentials 模板

[default]
node_name = "admin"
client_key = "/home/ops/chef-repo/.chef/admin.pem"
chef_server_url = "https://cinc-server.internal/organizations/prod"
cookbook_path = ["/home/ops/chef-repo/cookbooks"]

要点:私钥权限 0600;多环境追加 profile 段;有了 credentials 就不再维护 knife.rb,避免双文件漂移。

九、常见问题

Q1:改了 client.rb 不生效?

先确认运行形态:cinc-solo / --local-mode 不读 client.rb(读 -c 指定的 solo.rb),client/server 模式才读 /etc/cinc/client.rb;再查是否有 client.d 片段或 --config-option 覆盖。

Q2:knife 报 CONFIGURATION ERROR:Specified config file ... knife.rb does not exist?

显式 -c 或发现路径指向了不存在的 knife.rb。knife 19 新名为 config.rb——新建 config.rb 或改用 credentials(7.2),实测报错原文见 7.1。

Q3:credentials 和 config.rb 哪个先生效?

credentials。knife config show 首行会打印实际加载源(实测 Loading from credentials file /root/.cinc/credentials)。

Q4:chef_license "accept" 是什么?CINC 不是没有 EULA 吗?

CINC 分发本身无 EULA,但上游代码内置的许可确认机制仍在;填 accept 后标记落盘到 /etc/cinc/accepted_licenses/,之后运行不再提示。

Q5:自签证书的服务端,客户端怎么信任?

把服务端 CA/证书 PEM 拷入 /etc/cinc/trusted_certs/ 即可,不要把 ssl_verify_mode 降级为 :verify_none。

十、参考链接