ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Chef Infra 开发者工具指南:用 chef-apply 从命令行快速执行单个 Recipe

2026/9/26 10:10:45 拓冰建站 浏览量
Chef Infra 开发者工具指南:用 chef-apply 从命令行快速执行单个 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 开发者和高级用户系统讲解 Chef Infra 代码仓库中位于docs/dev/devtools/下的开发者工具文档并以其中唯一的工具条目chef-apply可执行程序为主线展开。你将掌握 chef-apply 的全部命令行选项、三种 recipe 输入方式、why-run 模式的用途以及它在 Chef Infra 源码lib/chef/application/apply.rb中从参数解析到资源收敛的完整执行链路从而在日常调试、资源探索和快速验证中获得可直接落地的实战方案。认识 devtools 文档区官方不背书、后果自负的“龙区”仓库中的 docs/dev/devtools/README.md 用一句经典的 “Here there be dragons”此处有龙作为开场明确界定了这一文档区的定位Here is where we document tools that may be useful to Chef developers or power users. These tools have no guarantees and are not supported. Youre welcome to use them, but you are on your own.翻译过来就是这里收录的工具对 Chef 开发者或高级用户可能很有用但官方不做任何保证、不提供支持你可以放心使用但出了问题要自己负责。因此阅读本文后你应当把 chef-apply 定位为“探索与调试利器”而不是生产环境的正式运行方式。该目录下目前仅有一份工具文档chef-apply.md对应 Chef Infra 中的chef-apply可执行程序。在仓库源码层面它的实现位于 lib/chef/application/apply.rb产品常量定义在 chef-utils/lib/chef-utils/dist.rbChefUtils::Dist::Apply其中PRODUCT Chef Infra Apply、EXEC chef-apply。chef-apply 是什么探索资源的单机利器根据 chef-apply.mdchef-apply 是一个从命令行直接运行单个 recipe 的可执行程序它有三个关键特征属于 Chef Workstation工具链的一部分源码中通过ChefUtils::Dist::Apply::EXEC引用其二进制名chef-apply是探索 Chef 资源resource的绝佳方式——无需 cookbook、无需 Chef Server一行命令即可验证某个资源的写法与行为不是 Chef 在生产环境中的运行方式——生产环境应当使用 chef-client / chef-solo 的完整运行体系。它在仓库中的实现类是Chef::Application::Apply继承自 lib/chef/application.rb 中的Chef::Application其启动横幅写明了完整的用法形态Usage: chef-apply [RECIPE_FILE | -e RECIPE_TEXT | -s] [OPTIONS]也就是说chef-apply 接受三种输入来源recipe 文件路径、-e传入的 recipe 文本、-s从标准输入读取后面可跟任意选项。命令语法与全部选项基本语法chef-apply name_of_recipe.rb选项总览原文档 chef-apply.md 给出的核心选项如下选项完整形式说明-e RECIPE_TEXT--execute RECIPE_TEXT用一个字符串执行资源recipe 内容直接写在命令行里-l LEVEL--log_level LEVEL写入日志文件的日志级别-s--stdin使用标准输入STDIN执行资源-v--version显示 Chef Infra Client 版本-W--why-run以 why-run 模式运行该模式会执行除“真正修改系统”之外的一切动作用于理解 Chef Infra Client 的决策依据以及系统当前状态与目标状态-h--help显示命令帮助信息源码中的扩展选项对照 apply.rb 的实现Chef::Application::Apply实际注册的选项比文档更多值得一并掌握选项说明-j JSON_ATTRIBS/--json-attributes JSON_ATTRIBS从一个 JSON 文件或 URL 加载节点属性源码中由Chef::ConfigFetcher获取并解析-F FORMATTER/--format FORMATTER指定输出格式如 doc/minimal 等通过Chef::Config.add_formatter(format)生效-L LOGLOCATION/--logfile LOGLOCATION设置日志文件位置默认输出到 STDOUTdaemon 化场景推荐使用--force-logger/--force-formatter强制使用 logger 或 formatter 输出--always-dump-stacktrace无论日志级别如何总是输出完整堆栈--yaml将 recipe 按 YAML 格式解析详见下文--minimal-ohai只运行 Chef Infra 运行所需的最少量 Ohai 插件加快启动--[no-]color彩色输出开关默认开启--[no-]profile-ruby输出整次运行的完整 Ruby 调用图仅限专家使用--license-add/--license-list向许可证池添加 / 列出许可证密钥仅当二进制名为chef-apply时注册日志级别-l的可选值在源码中定义为trace, debug, info, warn, error, fatal见 apply.rb比文档描述更明确。实战示例从运行 recipe 到安装软件包以下示例均来自原文档 chef-apply.md保留了完整命令与输出。运行一个 recipe 文件假设当前目录下有一个名为machinations.rb的 recipechef-apply machinations.rb执行后chef-apply 会读取该文件并在本机完成资源收敛。安装 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重复执行同一个 recipe幂等性验证再次执行sudo chef-apply -e package vim返回Recipe: (chef-apply cookbook)::(chef-apply recipe) * package[vim] action install (up to date)注意第二次输出变成了(up to date)——这正是 Chef 资源模型的**幂等idempotent**特性目标状态已满足时不再重复操作。这一点在 kitchen-tests 的 end_to_end cookbook 等集成场景中同样被反复验证。需要说明的是上述示例输出中的版本号如23.1-25.el6、2.0.9-7.el6来自文档编写时的 RHEL 6 系环境属示意性质在你的系统上会显示该发行版仓库中实际解析到的版本。使用标准输入除了-e传字符串还可以用-s从标准输入喂入 recipeecho package htop | sudo chef-apply -s该能力对应源码中config[:stdin]分支recipe_text STDIN.read随后与-e一样写入临时文件再执行apply.rb。源码视角chef-apply 的一次运行经历了什么要让“一行命令跑一个 recipe”成立Chef::Application::Apply在 apply.rb 中完成了以下关键步骤参数与配置初始化reconfigure调用parse_options解析命令行将结果合并进Chef::Config随后完成日志、代理export_proxies、OpenSSLinit_openssl初始化并调用parse_json处理-j传入的属性文件。读取 recipe 内容run_chef_recipe按优先级处理三种来源——-e的字符串、-s的 STDIN 均写入一个临时文件Tempfile.open(recipe-temporary-file)这样出错时用户能拿到带上下文的报错否则读取命令行第一个参数指定的 recipe 文件若既无-e也无-s且没有文件参数则直接报错退出No recipe file provided抛Chef::Exceptions::RecipeNotFound。构造 run contextget_recipe_and_run_context强制设置Chef::Config[:solo_legacy_mode] true创建Chef::Client实例并依次执行run_ohai、load_node、build_node再基于节点构造Chef::RunContext最后创建一个名为(chef-apply cookbook)::(chef-apply recipe)的Chef::Recipe——这正是示例输出中Recipe: (chef-apply cookbook)::(chef-apply recipe)一行的来源。解析 recipe默认通过recipe.instance_eval(recipe_text, recipe_filename, 1)执行 Ruby 代码若传入--yaml或文件扩展名为.yml则走recipe.from_yaml(recipe_text)分支按 YAML 解析 recipe。收敛与收尾创建Chef::Runner并调用runner.converge执行资源结束后关闭临时文件句柄并调用Chef::Platform::Rebooter.reboot_if_needed!处理需要重启的情况apply.rb。整个流程与单元测试 spec/unit/application/apply_spec.rb 相互印证该测试用例断言reconfigure后Chef::Config[:solo_legacy_mode]为真、read_recipe_file对空参数/不存在文件会触发Chef::Application.fatal!、临时文件会以recipe-temporary-file前缀创建并回写 recipe 文本以及-j属性会通过Chef::ConfigFetcher正确加载。why-run 模式先看后做-W/--why-run是文档中特别强调的调试选项。它对应源码中 apply.rb 的option :why_run开启后 Chef Infra 会完整走一遍运行流程但不真正修改系统——每个资源都会展示它“将要做什么”输出中会标明 which actions would have been taken。典型用法sudo chef-apply -W -e package nginx适用于以下场景理解 Chef Infra 为什么做出某个决策决策依据查看系统当前状态与chef-apply 期望的目标状态之间的差异在正式执行前对 recipe 进行安全的“彩排”。适用边界何时该用、何时不该用结合 devtools README 与 chef-apply.md 的定位可以给出清晰的使用建议适合使用 chef-apply 的场景快速验证某个资源写法的正确性如package、file、user等资源属于“探索资源”的第一现场在本机临时安装/配置软件不想为一次性任务搭建完整 cookbook 工程调试单条 recipe 逻辑、验证 why-run 输出、测试属性加载-j与 YAML recipe--yaml。不应使用 chef-apply 的场景生产环境的基础设施配置与持续管理——文档明确强调它NOT是 Chef 的生产运行方式需要 cookbook 版本管理、Chef Server/Policyfile、依赖解析、多节点管理、报告与审计等能力的正式流水线这些应交给 chef-client / chef-solo依赖官方支持与 SLA 的任务——devtools 区工具“没有保证、不被支持”。小结chef-apply 是 Chef Infra 开发者与高级用户工具箱里一件小而锋利的工具语法简单chef-apply [RECIPE_FILE | -e RECIPE_TEXT | -s] [OPTIONS]、反馈直观收敛输出直接展示每个资源的动作与幂等状态、模式丰富why-run、YAML、JSON 属性均可。通过阅读 lib/chef/application/apply.rb 与 spec/unit/application/apply_spec.rb 的源码你能进一步理解它如何借助Chef::Client、Chef::RunContext与Chef::Runner完成从文本到收敛的完整闭环。记住它的边界——用于探索与验证而非生产——你就能安全地在“龙区”里淘到宝。赞分享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 Infra Client 在命令行中运行单个 Recipechef apply 使用指南用 Chef Infra Client 在命令行中运行单个 Recipe chef apply 是 Chef WorkstatiDevOps运维IaCGetQzonehistory用 Python 一键导出 QQ 空间全部历史说说备份操作完整指南GetQzonehistory用 Python 一键导出 QQ 空间全部历史说说备份操作完整指南 GetQzonehistory 是一个开源的 Pytho网页爬虫数据分析DB-GPT 如何导入自定义 Skillzip 上传或 GitHub 链接并在对话中使用DB GPT 如何导入自定义 Skillzip 上传或 GitHub 链接并在对话中使用 当你的团队或社区已经有了打包好的 Skill .zip / .sDevOps运维IaC上一篇终极指南如何利用Redux-Saga与GraphQL打造高效数据获取与缓存系统下一篇为什么你的Linux终端需要Terminator-themes提升开发效率的终极解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考