Chef中Resource与Provider的区别解析及代码示例问询
通俗解释Chef的Resource与Provider,附代码分析
别急,我刚入坑Chef的时候也被Resource和Provider这俩概念绕得头大,给你用大白话掰扯清楚:
一、Resource(资源):只说“要什么”,不说“怎么做”
你可以把Resource理解成一份“需求说明书”:它只描述你希望系统达到什么状态,完全不管具体怎么实现这个状态。
- 比如自带的
service资源:service "nginx" do action [:enable, :start] end,它只说“我要nginx服务开机自启,并且现在处于运行状态”,至于Linux上是用systemctl enable还是CentOS 6的chkconfig,它一概不管。 - 核心特点:抽象、通用,只定义目标,不涉及细节。
二、Provider(提供者):负责“干活”的执行者
Provider就是具体实现需求的“工人”:它把Resource的抽象需求,转换成对应操作系统/环境下的实际命令或操作。
- 还是拿
service资源举例:在systemd系统上,它会调用Chef::Provider::Service::Systemd这个Provider,执行systemctl相关命令;在Upstart系统上,会切换到Chef::Provider::Service::Upstart,用initctl来操作。 - 核心特点:具体、针对性强,一个Resource可以对应多个Provider,Chef会自动根据环境匹配,也能手动指定。
通俗类比
Resource = 你给外卖平台发消息:“我要一份微辣的番茄炒蛋,送到楼下”(只说需求)
Provider = 餐厅后厨的厨师+配送员:厨师负责按要求炒出菜,配送员负责送到你手上(具体执行)
三、你的代码分析
先把代码格式化一下:
jboss10_dev "dev" do action :update provider "jboss10dev_jboss_update" end
这是一段自定义Cookbook里的代码(jboss10_dev不是Chef自带资源),拆解来看:
jboss10_dev "dev":声明一个自定义Resource,"dev"是这个资源的标识(比如用来区分不同的JBoss环境,比如dev/test/prod),它的作用是描述“对JBoss 10开发环境进行操作”这个需求。action :update:指定这个Resource要执行的动作是「更新」——具体更新什么?可能是升级JBoss版本、同步配置文件、重启服务等,得看这个自定义Resource的设计。provider "jboss10dev_jboss_update":手动指定了执行这个动作的Provider。因为自定义Resource可能有多个对应的Provider(比如不同环境下更新逻辑不同),这里强制要求用jboss10dev_jboss_update这个自定义Provider来完成“更新”动作,它里面写了具体的操作步骤(比如执行某个脚本、修改特定配置、调用JBoss的管理命令等)。
简单说,这段代码的意思就是:请把我的JBoss 10开发环境(标识为"dev")更新到指定状态,并且用jboss10dev_jboss_update这个具体的执行者来完成这件事。
内容的提问来源于stack exchange,提问作者voltas
相关产品推荐
相关产品推荐

