首页/新闻资讯/正文详情

chef-apply 使用指南:用 Chef Infra Client 在命令行中运行单个 Recipe

发布时间:2026/9/26 2:37:01 来源:云帆数科 栏目:资讯中心
chef-apply 使用指南:用 Chef Infra Client 在命令行中运行单个 Recipe
DevOps运维IaC【免费下载链接】chefChef Infra, a powerful automation platform that transforms infrastructure into code automating how infrastructure is configured, deployed and managed across any environment, at any scale项目地址https://gitcode.com/gh_mirrors/ch/chef点击查看免费下载chef-apply 是 Chef Workstation 附带的一个可执行程序用于在命令行中直接运行单个 recipe无需 Cookbook、Chef Server 或完整的 chef-client 配置。本文基于 Chef Infra 仓库的官方文档 docs/dev/devtools/chef-apply.md结合 lib/chef/application/apply.rb 的实现源码与 spec/unit/application/apply_spec.rb 的单元测试完整讲解它的命令语法、全部选项、运行原理与典型使用场景帮助你用最轻量的方式快速体验和探索 Chef 资源模型。什么是 chef-applychef-apply 是 Chef Workstation 自带的命令行工具用于直接运行一个 recipe 文件。它的核心定位可以概括为三点是 Chef Workstation 的一部分随 Chef Workstation 一起安装分发与 knife、chef-client 等工具同属工作站工具集是探索资源resource的绝佳途径可以用一条命令、一个字符串甚至标准输入快速验证某个资源在目标系统上的行为而不必搭建完整的 Cookbook 工程不是生产环境运行 Chef 的方式生产环境应使用 chef-client或 chef-solo 等配合 Cookbook、Run List 与 Chef Server/Chef Automate 进行受管、可重复的配置管理。chef-apply 只适合单机、临时、交互式的场景。从仓库源码看chef-apply 的实际入口是 chef-bin/bin/chef-apply它加载chef/application/apply并执行Chef::Application::Apply.new.run(enforce_license: true)其中Chef::Application::Apply定义在 lib/chef/application/apply.rb 中它继承自Chef::Application是 Chef Infra Client 应用框架的一个轻量子类。产品名称与可执行名在 chef-utils/lib/chef-utils/dist.rb 中定义class Apply # The chef-apply product name PRODUCT Chef Infra Apply # The chef-apply binary EXEC chef-apply end命令语法与全部选项chef-apply 的命令语法为chef-apply name_of_recipe.rb也可以使用选项形式完整的用法帮助文本定义于源码的 banner 中见 lib/chef/application/apply.rbUsage: chef-apply [RECIPE_FILE | -e RECIPE_TEXT | -s] [OPTIONS]即位置参数传 recipe 文件路径或用-e传字符串、用-s从标准输入读取两者选其一。官方文档列出的核心选项如下选项说明-e RECIPE_TEXT,--execute RECIPE_TEXT直接执行一段字符串形式的资源声明-l LEVEL,--log_level LEVEL设置写入日志文件的日志级别-s,--stdin从标准输入读取并执行资源声明-v,--version显示 Chef Infra Client 版本号-W,--why-run以 why-run 模式运行执行除真正修改系统之外的所有步骤用于理解 Chef Infra Client 的决策逻辑查看系统当前状态与建议状态-h,--help显示命令帮助源码中定义的全部选项对照 lib/chef/application/apply.rb 中option声明可以拿到官方文档之外更完整的选项清单包括-j JSON_ATTRIBS,--json-attributes JSON_ATTRIBS从一个 JSON 文件或 URL 加载 node 属性json_attribs见parse_json与Chef::ConfigFetcher源码 lib/chef/application/apply.rb 与parse_json方法 lib/chef/application/apply.rb-L LOGLOCATION,--logfile LOGLOCATION指定日志文件位置默认输出到 STDOUT适合需要守护化运行时使用--force-logger/--force-formatter强制使用 logger 或 formatter 输出风格-F FORMATTER,--format FORMATTER指定输出格式--[no-]always-dump-stacktrace无论日志级别如何都输出完整堆栈--[no-]profile-ruby导出整个 Chef Infra Client 运行的完整 Ruby 调用图仅限专家使用--[no-]color是否使用彩色输出默认启用--minimal-ohai只运行 Chef Infra Client 正常运行所必需的最少 Ohai 插件集--yaml将 recipe 按 YAML 格式解析--license-add/--license-list向许可证池添加 / 列出许可证密钥在chef-apply可执行名下有效见 lib/chef/application/apply.rb。其中-l/--log_level的可用值包括trace、debug、info、warn、error、fatal源码通过proc: lambda(:to_sym)将字符串转换为符号后写入 Chef 配置lib/chef/application/apply.rb。典型用法示例官方文档提供了四组可直接复制的实战示例下面逐一说明其输出含义。运行一个 recipe 文件假设当前目录下有一个名为machinations.rb的 recipe 文件直接执行chef-apply machinations.rb执行时chef-apply 会打开该文件并读取其内容见read_recipe_file方法 lib/chef/application/apply.rb随后在构造的 run context 中执行 recipe 内的全部资源声明。若文件不存在会以Chef::Exceptions::RecipeNotFound致命错误退出。用-e直接安装软件包安装 Emacssudo chef-apply -e package emacs返回结果Recipe: (chef-apply cookbook)::(chef-apply recipe) * package[emacs] action install - install version 23.1-25.el6 of package emacs安装 nanosudo chef-apply -e package nano返回结果Recipe: (chef-apply cookbook)::(chef-apply recipe) * package[nano] action install - install version 2.0.9-7.el6 of package nano安装 vimsudo chef-apply -e package vim返回结果Recipe: (chef-apply cookbook)::(chef-apply recipe) * package[vim] action install - install version 7.2.411-1.8.el6 of package vim-enhanced注意上面示例中的软件包版本号如23.1-25.el6、7.2.411-1.8.el6来自 RHEL/CentOS 6 时代的 yum 仓库是文档写作时的历史输出示例并非当前仓库或当前发行版的固定结果。实际运行时会解析目标系统当前包仓库中可用的版本输出相应变化。package 资源会调用对应平台的包管理器 provider见 lib/chef/provider/package 目录下的各平台实现在 Debian/Ubuntu 上对应 apt在 RHEL 系上对应 yum/dnf在 macOS 上则对应 homebrew。示例输出中的第一行Recipe: (chef-apply cookbook)::(chef-apply recipe)也印证了源码的实现细节chef-apply 会创建一个名为(chef-apply cookbook)的虚拟 cookbook 与名为(chef-apply recipe)的虚拟 recipe用于承载命令行提供的 recipe 文本见 lib/chef/application/apply.rbrecipe Chef::Recipe.new((#{ChefUtils::Dist::Apply::EXEC} cookbook), (#{ChefUtils::Dist::Apply::EXEC} recipe), run_context)重复运行同一 recipe幂等性验证再次运行安装 vim 的命令sudo chef-apply -e package vim返回结果Recipe: (chef-apply cookbook)::(chef-apply recipe) * package[vim] action install (up to date)这正是 Chef 资源模型幂等性的直接体现第二次执行时package 资源通过 provider 的load_current_resource机制探测到 vim 已经安装于是跳过实际修改仅在输出中标注(up to date)。这也说明 chef-apply 与 chef-client 共享同一套资源收敛converge与幂等判定逻辑。从标准输入与字符串执行 recipe除-e之外-s/--stdin让 recipe 文本可以从管道或 heredoc 中输入。源码中的执行优先级为见run_chef_recipe方法 lib/chef/application/apply.rb若指定了-e将config[:execute]字符串写入一个临时文件temp_recipe_file临时文件名形如recipe-temporary-file以便出错时能展示带上下文的错误信息否则若指定了-s读取 STDIN 的全部内容写入临时文件否则取ARGV[0]作为 recipe 文件路径并读取。因此可以这样使用管道echo package htop | chef-apply -s由于最终统一走临时文件 instance_eval的执行路径-e、-s与文件三种方式在行为上是一致的。运行原理chef-apply 内部做了什么从源码可以梳理出 chef-apply 一次完整运行的调用链入口chef-bin/bin/chef-apply加载chef/application/apply调用Chef::Application::Apply.new.run(enforce_license: true)chef-bin/bin/chef-apply重新配置reconfigure中执行parse_options把命令行选项合并进Chef::Config随后configure_logging、export_proxies、init_openssl并按需用Chef::ConfigFetcher解析 JSON 属性lib/chef/application/apply.rb构建运行上下文get_recipe_and_run_context将Chef::Config[:solo_legacy_mode]置为true创建Chef::Client并依次调用run_ohai、load_node、build_node以本机 Ohai 探测数据构建 node 对象再据此构造Chef::RunContextlib/chef/application/apply.rb。其中load_node/build_node的定义在 lib/chef/client.rb实际委托给 PolicyBuilder执行 recipe新建名为(chef-apply cookbook)::(chef-apply recipe)的虚拟 Recipe 对象默认通过recipe.instance_eval(recipe_text, filename, 1)执行 recipe 文本若传了--yaml或文件扩展名为.yml则改走recipe.from_yaml解析 YAML 格式的 recipe见 lib/chef/recipe.rb 与from_yaml_filelib/chef/recipe.rb收敛用Chef::Runner.new(run_context)执行runner.converge完成资源收敛并在 finally 中关闭临时文件句柄最后通过Chef::Platform::Rebooter.reboot_if_needed!按需触发系统重启lib/chef/application/apply.rb退出正常完成则输出Exiting并以退出码 0 结束异常则由Chef::Application.fatal!统一处理并输出堆栈。单元测试对行为的印证仓库中 spec/unit/application/apply_spec.rb 覆盖了上述关键行为可以作为理解工具行为的参考强制 solo 模式reconfigure后Chef::Config[:solo_legacy_mode]必须为true对应get_recipe_and_run_context中的设置读取 recipe 文件read_recipe_file正确返回文本与文件句柄传入nil时抛出未提供 recipe 文件的致命错误文件不存在时抛出文件不存在错误临时文件temp_recipe_file创建的临时文件路径匹配recipe-temporary-file模式且写入内容与-e传入的 recipe 文本一致缺失参数不传 recipe 文件时以退出码 1 结束并记录No recipe file providedJSON 属性指定json_attribs配置时会通过Chef::ConfigFetcher从指定来源读取属性。使用建议与注意事项需要 root/sudo安装类资源通常需要管理员权限官方示例均使用sudo chef-apply只适用于单机临时场景chef-apply 不连接 Chef Server不处理 cookbook 依赖、数据包data bag、环境environment等企业级编排能力生产环境请使用完整的 chef-client 运行模型why-run 模式不确定某个资源会做什么时先加-W/--why-run预览 Chef 的决策与建议状态再实际执行YAML recipe当前实现还支持以 YAML 格式编写 recipe顶层需包含resources或include_recipes键且只支持单个 YAML 文档见 lib/chef/recipe.rb可通过--yaml选项或.yml扩展名触发版本查看用chef-apply -v确认当前 Chef Infra Client 版本。总结chef-apply 以一行命令跑一个 recipe的轻量形态把 Chef 资源模型的表达能力直接暴露在命令行中。它既是新手探索 package、service、file 等资源的快捷入口也是运维人员在单机上做临时配置操作的实用工具——但正如官方文档明确强调的它不是生产环境的运行方式。理解它的选项、输出与内部调用链能帮助你更快地上手 Chef Infra 的资源体系并在合适的场景中选择正确的工具。赞分享DevOps运维IaC【免费下载链接】chefChef Infra, a powerful automation platform that transforms infrastructure into code automating how infrastructure is configured, deployed and managed across any environment, at any scale项目地址https://gitcode.com/gh_mirrors/ch/chef点击查看免费下载相关推荐DB-GPT 如何导入自定义 Skillzip 上传或 GitHub 链接并在对话中使用DB GPT 如何导入自定义 Skillzip 上传或 GitHub 链接并在对话中使用 当你的团队或社区已经有了打包好的 Skill .zip / .sDevOps运维IaCSalt Chef 执行模块salt.modules.chef实战指南在 Salt 中编排 chef-client 与 chef-soloSalt Chef 执行模块salt.modules.chef实战指南在 Salt 中编排 chef client 与 chef solo 导读本文围绕运维配置管理后端ImageHash最佳实践5个常见问题与解决方案ImageHash最佳实践5个常见问题与解决方案 ImageHash是一个强大的PHP感知哈希库能够为图片生成独特的指纹实现高效的图片相似度比较。本文将介计算机视觉开发工具上一篇如何为rogauracore贡献代码开源项目参与完全教程下一篇Gox多模块支持如何同时构建多个Go项目的跨平台版本创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

OpenCV与dlib实现疲劳驾驶检测:人脸关键点与EAR阈值实战
OpenCV与dlib实现疲劳驾驶检测:人脸关键点与EAR阈值实战

简介:基于OpenCV和Dlib实现的疲劳驾驶检测系统完整工程,面向计算机视觉入门者、智能座舱开发者以及安全驾驶相关课题研究者,用于实时监测驾驶员的眨眼、闭眼和头部姿态,及时发出疲劳预警。系统以Python编写,将OpenCV的… · 2026/9/26 2:37:01

微盛·企微管家AI实战:私域运营从会话存档到智能跟进的升级路径
微盛·企微管家AI实战:私域运营从会话存档到智能跟进的升级路径

1. 为什么2025年的私域运营,突然绕不开AI了?做私域运营的朋友应该都有同感:这两年"企业微信"已经从可选项变成了必选项。银行客户经理用它维护高净值客户,零售导购用它做会员复购,教育机构用它做试听转化。但… · 2026/9/26 2:36:55

AI智能体对话平台实战复盘:工作流编排与RAG落地
AI智能体对话平台实战复盘:工作流编排与RAG落地

开发完这个AI智能体对话平台之后,我一直没想好要不要写一篇后记。项目上线跑了一个多月,用户量虽然不算爆炸,但每天都有真实的人在问问题、调流程、改配置,甚至有几个人在评论区提出了一些我当初根本没考虑过的使用场景。恰好最近… · 2026/9/26 2:36:55

AI‘降智’幻觉:用户认知错位与提示工程升级指南
AI‘降智’幻觉:用户认知错位与提示工程升级指南

1. “Gemini降智”不是技术故障,而是公众对AI认知错位的一次集中爆发最近两周,“Gemini降智”这个词在多个内容平台高频出现——不是出现在技术社区的issue tracker里,也不是写在模型评测报告的误差分析章节中,而是大量出现在短视… · 2026/9/26 6:01:20

计及光伏逆变器快速无功响应的分布式电源优化配置方法
计及光伏逆变器快速无功响应的分布式电源优化配置方法

1. 从一次电压越限事故说起:为什么配置方案不能只看有功去年我给一个工业园区做分布式电源接入方案,光伏装机容量按负荷峰值的80%来配,无功补偿按传统方式配了几组并联电容器。结果夏天光伏大发的时候,10kV母线电压直接飙到1.07pu… · 2026/9/26 6:01:20

工业轴承故障诊断中的域适应实战:DANN建模与工况对齐
工业轴承故障诊断中的域适应实战:DANN建模与工况对齐

1. 这不是“解题模板”,而是一套可落地的工业故障诊断建模实战手册“华为杯”研究生数学建模竞赛E题,近几年持续聚焦工业设备智能运维这一硬核场景,2025年E题虽未正式发布,但结合历年命题逻辑、官方数据集命名习惯(如“… · 2026/9/26 6:01:14

Cosmos 3:可微分物理引擎驱动的工业AI新范式
Cosmos 3:可微分物理引擎驱动的工业AI新范式

1. 这不是又一个“大模型”,而是物理世界建模范式的迁移起点“英伟达发布Cosmos 3”这个标题刷屏时,我正调试一台Jetson Orin NX开发板上的多传感器融合节点——激光雷达点云、IMU姿态、摄像头图像流在ROS2里跑得磕磕绊绊,每次更换地面材质&a… · 2026/9/26 6:01:14

Oracle AWR报告生成与解读:三分钟定位数据库性能瓶颈
Oracle AWR报告生成与解读:三分钟定位数据库性能瓶颈

前阵子凌晨一点被电话叫醒,生产库CPU直接拉满,登上去看系统状态一切正常,监听也在跑,会话数没有爆发式增长,但业务就是卡死。靠直觉猜了十分钟毫无头绪,最后是一份AWR报告让问题原形毕露——一条漏了索引的… · 2026/9/26 6:01:08

Claude Code模板实战:从失忆Agent到高效项目上下文固化
Claude Code模板实战:从失忆Agent到高效项目上下文固化

我真正开始重度使用 Claude Code,是在接手第四个完全陌生的代码仓库之后。工具本身安装不算难,难的是每次进入新项目,Agent 都会变得"失忆":上个月刚在这套技术栈上踩过的坑,换个仓库它又踩一遍;… · 2026/9/26 6:01:08

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码