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),仅供参考