想象你是连锁餐饮集团的技术负责人。你一口气开了十家分店,可每家店的厨房都是店长凭记忆装的:有人装了老版本收银系统,有人把防火墙规则偷偷改了,有人日志盘塞得满满的……菜单明明一样,后厨却千差万别——这就像服务器集群的“配置漂移”。 直到总部请来一位“标准化大师”。他先写出一本《标准厨房手册》:每家店装什么软件、什么版本、开放什么端口,白纸黑字。然后派两类角色落地:一类是“厨师长”,把自己的操作写成配方(Recipe)和菜谱集(Cookbook),让每家店定期照做——这就是 Chef;另一类是“督导员”,拿着检查清单(Manifest)定期巡查,发现不符合就当场纠正——这就是 Puppet。 本文就用这场“餐厅标准化革命”带你入门配置管理:搞懂手动运维的痛点、声明式配置与幂等性的奥秘、与 Ansible 的对比,以及最终如何为团队选型。读完你将有底气把“人肉运维”升级为“基础设施即代码”,摸到 DevOps 工程师的核心手艺。
掌握配置管理工具,是 DevOps 工程师把“人肉运维”升级为“基础设施即代码”的分水岭——它直接决定了你能否在大规模集群中持续保持一致性、可追溯性与交付效率。
目录
可视化演示
展示Chef和Puppet配置管理工具的架构流程,对比声明式与命令式配置,以及与Ansible的核心能力差异。
本节配有交互动效(进入视口后自动加载,约 3KB)。
Chef架构与工作流 Chef使用Ruby编写Cookbook和Recipe,命令式配置 Master分发Cookbook到目标节点执行配置变更 Chef → Cookbook → Recipe → Node 命令式配置,适合复杂基础设施自动化场景
配置管理基础——为什么需要《标准厨房手册》
假设你经营一家连锁火锅店,三个月内连开十家分店。每家店的厨房开业前,都是店长带着老员工凭经验“手动装配”:灶台买哪个牌子、燃气管道怎么接、后厨软件装哪个版本,全靠师傅们口口相传。一开始没什么,日子一长你发现:A 店的收银系统还是去年的老版本,B 店的防火墙规则被某个离职员工改过,C 店的日志目录悄悄挪了位置。菜单完全一样,检查结果却参差不齐——这就是机房运维真实的“配置漂移”现场。
配置管理(Configuration Management)要解决的,正是“每台服务器最终该是什么样”的问题。手动 SSH 登录一台一台敲命令,除了慢,更大的隐患是“不可复现”——你今天在测试环境验证过的命令,生产环境很可能因为一些细小差异当场翻车。Chef 和 Puppet 给出的思路是:把“服务器应该处于什么状态”写成一本书、一份清单,然后让机器照着比对、收敛。你不再关心“怎么改”,只关心“改成什么样”。
在配置管理语境里,有两个核心状态:期望状态(Desired State)与实际状态(Actual State)。配置漂移(Drift)指的就是两者产生偏差。工具会定期做差异检测:把每台机器的实际配置拉出来,逐项对照期望清单,凡不一致的项就判定为漂移,随后执行修正步骤把它拉回正轨。这个“检测→修正→再检测”的闭环,是所有声明式配置工具的心脏。
回到火锅店的例子:想让十家店厨房完全一致,靠人肉巡检是守不住的——总有人手痒改配置,总有人绕开规程。配置管理的意义,不是“改了之后再也不变”,而是“变了之后系统能自己发现、自己纠正”。这正是 Chef 和 Puppet 存在的理由。
- $S_{\text{actual}}$——实际状态服务器当前真实运行参数,比如 nginx 版本、监听端口、配置文件内容。
- $S_{\text{expected}}$——期望状态配置管理文件里声明的目标值,例如“nginx 必须为 1.24”。
- $\neq$——逐项比对把期望清单每一项与实际值做差异检测,这是收敛循环的“检查”环节。
- $\Rightarrow \text{Drift}=1$——判定漂移只要存在不一致就进入漂移状态,触发后续修正动作。
Chef核心概念——从“配方”到“菜谱集”
在连锁餐厅的剧本里,Chef 扮演“厨师长”。厨师长有个习惯:每研发出一道成功的菜,就把配料、火候、装盘写成一张“配方卡”(Recipe);攒多了,装订成一本“菜谱集”(Cookbook),统一发给所有分店。每家用同一本书做菜,端上桌的菜就和总店一模一样。
Chef 是 Ruby 写的配置管理框架。它的最小逻辑单元叫 Recipe(配方),一个 Recipe 里是一串资源声明;多个 Recipe 组成 Cookbook(菜谱集),并附带模板、文件、元数据等“配料”。Chef 采用典型的客户端-服务器架构:开发者在工作站(Workstation)用 Knife 工具把 Cookbook 上传到 Chef Server,每台被管理的服务器(Node)上安装 chef-client 代理,代理定期回连 Server,拉取自己该执行的 Recipe 并应用。这个“定期拉取”机制,是 Chef 持续对抗漂移的根本思路。
Chef 的“配方”由一个个 Resource(资源)组成。资源是声明式的:你只需说“我要一个 package 资源,名叫 nginx,动作是 install”,Chef 会判断这台机器是否已装——没装就装,装了就不动。一个资源通常包含四要素:类型(type)、名称(name)、属性(attributes)和动作(action)。整本配方,就是一组“我要什么、不要什么”的声明,而不是“怎么装”的步骤。
回到餐厅:厨师长不会在每个分店现场指挥,而是把经验沉淀成菜谱集,让各店厨师照做。Chef 的哲学正是“经验即代码”——运维大师把最佳实践写进 Recipe,任何新节点上线自动获得同样标准。这就是配置管理把“人的经验”转变为“机器的默认行为”。
- type——资源类型如 package(软件包)、service(服务)、file(文件)、user(用户)。
- name——资源名称标识具体管理对象,例如 package 的名字 "nginx"。
- attributes——属性集合描述资源的配置细节,比如版本号、端口、文件权限。
- action——期望动作声明式地告诉系统“最终要我做什么”,如 install、start、delete。
Puppet核心概念——督导员的“检查清单”
如果说 Chef 是厨师长,那 Puppet 更像总部派出的“督导员”。督导员不进厨房动手做菜,他的武器是一份极详细的《检查清单》:每个灶台的火力范围、每瓶调料的位置、每台设备的参数,白纸黑字列出来。他定期到店,拿着清单逐项打勾:符合的划掉,不符合的当场要求整改,直到整家店完全符合清单为止。
Puppet 用 Manifest(清单)描述期望状态,一个 Manifest 文件声明一组资源及其属性。多个相关的 Manifest 连同模板、文件、测试打包在一起,构成 Module(模块),类似于一个“检查清单包”。Puppet 最常见的部署是主从架构(Master-Agent):被管理节点上的 agent 进程,每隔一段时间(默认 30 分钟)向 Puppet Master 发起连接,上传自己的 Facts(系统事实,如操作系统、IP、内核版本),Master 根据这些事实和节点定义编译出一份 Catalog(目录)——即这台机器专属的“检查清单”,下发给 agent 执行。
Puppet 的声明语法极具辨识度:file { '/etc/nginx.conf': ensure => file, mode => '0644' }——一整条声明直接描述了“期望状态”。如有偏差,agent 就执行修正;完全一致时什么都不做。这种“以目标为核心”的描述方式,让配置本身成为一份可审阅的文档,运维人员一眼就能看出系统该是什么样,而不是靠读命令脚本去脑补执行过程。
督导员的清单哲学给了 Puppet 一个特性:非常“守规矩”。它默认把服务器往清单上核对,核对不上就改回来,改完再核对,循环往复直到完全收敛。这种刻板反而成了它在金融、政府等重合规行业里的优势——毕竟,一份严谨的检查清单,比一个自由发挥的厨师更让人放心。
- $S_{\text{desired}}$——期望状态集合整份 Manifest 描述的目标,是所有资源声明的并集。
- $r_i$——第 i 个资源如 file、package、service,每个资源代表一项期望配置。
- title——资源标题定位到具体实例,例如
/etc/nginx.conf。 - attributes——属性集描述权限、内容、运行状态等细节。
声明式配置原理——只说“要什么”
想象你走进餐厅点菜。两种点法:一种是“先帮我把锅烧热,倒油,葱姜蒜爆香,下鸡块,加生抽……等我说起锅再起锅”——这叫命令式(Imperative),你事无巨细地指挥每一步。另一种是“我要一份宫保鸡丁,微辣”——这叫声明式(Declarative),你只描述最终要什么,厨房自己决定怎么做。Chef 和 Puppet 都坚定地选择第二种点法。
命令式脚本最大的痛点,是“重复执行不等于结果一致”。你写一个 shell 脚本装 nginx,第一次运行成功,第二次运行可能报“已存在”的错;你写脚本追加一行配置,跑十次就追加十行。声明式配置则把注意力放在“目标状态”上:脚本同样可以跑十次,但每次运行前先检查“目标是否已达成”,达成了就什么都不做。这个性质叫幂等性(Idempotence)。
幂等性是配置管理的基石。形式化地说,把一次配置操作看成函数 f,把系统状态看成输入 s,幂等性要求 f(f(s)) = f(s):操作重复一次,结果与操作一次完全一致。Chef 的每个 Resource 都先检查当前状态再决定是否动作;Puppet 的 agent 每轮都做“比对→修正”的收敛循环。正因为幂等,配置工具才能放心地定时执行——不管跑多少次,系统都停在期望状态,而不是越跑越乱。
声明式就像给厨房下订单而不是当执行导演。你不需要关心厨师是先切葱还是先热锅,你只关心“端上来的菜对不对”。配置管理工具也一样:把“怎么做”交给工具的资源和模块,把“要什么”写进代码里。这份从容,正是大规模运维最需要的品质。
- s——系统状态服务器当前的配置快照,如版本号、参数、文件内容。
- f——配置操作把一项资源声明施加到系统上,如装包、改配置、启服务。
- f(s)——首次应用第一次执行后得到新状态 f(s)。
- f(f(s))——重复应用再次执行时,因状态已满足期望,系统不做任何变化。
与Ansible对比——流动顾问的节奏
你开连锁餐厅的同时,还认识一位“流动顾问”。他不常驻任何一家店,也不往店里安插自己人。你在电话里告诉他“帮我把三家店的服务员培训一下”,他背个包直接上门,培训完就走,下次需要再来。这位顾问效率很高,只是每次都得亲自跑一趟——这就是 Ansible 的节奏。
Chef 和 Puppet 都属于“代理模式”(Agent-based):每台服务器上常驻一个 agent 进程,定期主动连服务器拉配置。Ansible 则采取“无代理模式”(Agentless):通过 SSH(Windows 用 WinRM)直接连上目标机器,把要执行的任务(Playbook 里的任务列表)推过去执行,执行完连接断开,不留常驻进程。一个是被动等待 agent 回来拉取(Pull),一个是主动推送(Push),这是两者最本质的架构区别。
无代理模式带来的直接好处是上手快:不需要预先在所有机器装 agent、不需要维护证书和注册流程,一条 ansible-playbook 命令就能批量办事。代价是,每次变更都需要“从控制端发起连接”,缺乏 agent 那种“即使控制端暂时故障、定时器也照常收敛”的韧性。因此常见的务实选择是:临时性批量变更、中小规模环境、混合云初探用 Ansible;超大规模、强合规、需要长期持续收敛的核心集群,常驻 Chef/Puppet 的 agent。两者不是替代关系,而是互补关系。
回到选顾问的故事:如果你只有三家店、偶尔需要突击检查,流动顾问随叫随到确实方便;但如果你有三百家直营店、要求每家消防参数 24 小时受控,那常驻督导员显然更可靠。理解了 Pull 与 Push、代理与无代理的区别,你就在“选哪个工具”这道题上答对了一半。
- $S_0$——初始状态Ansible 行动前目标机器的当前状态。
- $\Phi_{\text{playbook}}$——Playbook 操作Ansible 把一组任务推送到目标并执行,完成后得到 $S_{\text{push}}$。
- $S_t$——t 时刻状态Chef/Puppet 中节点第 t 轮收敛后的状态。
- $t \to \infty$——持续循环agent 不断重复“拉取—比对—修正”,保证长期一致。
基础设施自动化——让一百家店同时开业
现在你的餐饮集团要在三天内同时开业一百家新店。如果还是靠店长现场装修、逐台配置,工期至少翻十倍。但有了《标准厨房手册》和两类落地角色,总部只需做一件事:把新店的清单发出去,让各店自动“照单施工”。一百家店,同一套标准,误差趋近于零——这就是基础设施自动化的威力。
基础设施自动化(Infrastructure Automation)有四个关键词:批量(Batch)、可重现(Reproducible)、可追溯(Auditable)、抗漂移(Anti-drift)。Chef/Puppet 把配置写成代码后放进 Git 仓库——任何一次变更都有版本记录,谁改的、何时改的、改了什么,一目了然。新服务器上线,只需在配置管理系统中注册,agent 拉取清单即完成初始化,不需要人肉对照安装文档。
一个标准的持续收敛循环是这样运转的:第一步,agent 收集节点当前状态(Chef 的 Ohai、Puppet 的 Facts);第二步,向服务端请求“我该变成什么样”(Chef 拉取 Recipe、Puppet 拉取 Catalog);第三步,逐资源比对差异;第四步,执行修正动作。之后每隔一个周期重复一次。配置漂移被压缩到“一个巡检周期以内”,而不是“直到下次出事故才被发现”。
一百家店同时开业的底气,不是“每家店都很幸运没出岔子”,而是“即使出了岔子,系统也会在下一轮巡检中自己纠正”。把枯燥的重复劳动交给自动化的持续收敛,让人的精力集中到真正需要判断力的地方——这就是基础设施自动化给 DevOps 团队的最高回报。
- $S_0$——初始状态节点上线时的“裸机”配置。
- $\Phi_i$——第 i 轮收敛操作比对并修正差异,把状态推进到下一阶段。
- $\longrightarrow \cdots$——迭代过程多轮收敛不断逼近目标,直到差异消失。
- $S^{*}$——稳定态所有资源满足期望声明,漂移为零,收敛循环进入“只检查不动作”的稳态。
工具选型策略——最后一道选择题
假设你现在是总部的新任技术总监,手里有三套方案:常驻督导员(Puppet)、厨师长菜谱制(Chef)、流动顾问制(Ansible)。选哪个?没有标准答案,但有一套决策框架:先看团队、再看规模、三看合规、最后看钱包。就像开餐厅,米其林中央厨房和社区早餐店,用的管理方法注定不同。
决策维度一:团队技能。如果团队擅长 Ruby,Chef 的学习曲线最平滑;如果团队更熟 YAML 或 Puppet DSL,Ansible 几乎零门槛。决策维度二:架构复杂度。Puppet/Chef 的 C/S 架构本身也是一套需要运维的系统(Server 高可用、证书管理、agent 升级),小型团队可能不堪重负;Ansible 控制端轻量,几十台规模也能轻松驾驭。决策维度三:合规与韧性。金融、政务等强监管行业,Puppet 的“清单即证据”和 agent 离线收敛能力是刚需。
现实中,多数团队最终走向“混合方案”:核心业务集群用 Puppet 或 Chef 管理,保证长期稳态;临时扩容、紧急修复、多云环境用 Ansible 快进快出。甚至可以叠加:先用 Ansible 批量改一次,再用 Puppet 兜底持续收敛。选型不必非此即彼,关键是建立“以期望状态为核心”的统一心智。一个简单的加权评分模型可以帮助团队理性决策:
工具之争容易演变成“信仰之争”,但成熟的技术决策者会问:我们的问题,是缺一个常年保安,还是缺一个临时保洁?Puppet/Chef 像前者——常驻、守规矩、长期稳定;Ansible 像后者——灵巧、随时上门、不添负担。把问题翻译成需求,把需求映射到架构差异,选型这道题自然就有了答案。
- X——候选工具如 Chef、Puppet、Ansible 或混合方案。
- fit_i——第 i 个维度的适配分每个维度按 1-5 分打分。
- w_i——权重按团队当前痛点分配权重,例如“合规优先”则合规维度权重更高。
- Score——加权总分总分最高的方案就是当前最优解。
AI 应用场景
大规模 Web 集群的标准化基线管理
阶段:基础设施即代码 / 配置管理
解决的问题:传统方式下,几百台 Web 服务器靠人工登录配置,版本参差、安全补丁缺失、排查问题靠“这台机器比较特殊”的玄学。用 Chef 把 nginx、PHP、防火墙规则写成 Recipe,新机器注册后 agent 自动收敛到统一基线,任何手工改动都在下一轮巡检中被纠正。
具体案例:某电商团队管理 300 台生产节点,通过 Chef Server 配合环境隔离,实现“测试环境收敛一次,生产环境自动同款”;一次大规模安全加固只需更新 Cookbook 并等待两轮收敛周期,全部节点自动达标。
合规审计与补丁漂移修复
阶段:持续合规监控 / 安全运维
解决的问题:安全扫描发现 40 台机器存在 OpenSSL 漏洞,逐台登录修复既慢又可能引入新偏差。用 Puppet 只需更新 Module 中的软件包版本号,agent 下一轮巡检自动批量修复,并留下可追溯的变更记录,直接作为审计证据。
具体案例:某金融公司每季度接受等保检查,Puppet 的 Manifest 清单 + Git 变更历史直接打包提交审计;审计人员查看“期望状态声明”即可确认系统合规,无需逐台抽查服务器。
临时迁移与混合云批量操作
阶段:应急变更 / 云迁移
解决的问题:上云迁移时需要对 200 台服务器临时改 DNS、加防火墙白名单、批量部署监控 agent。若用 Puppet/Chef,前置的注册与 agent 安装成本拖慢节奏;用 Ansible 通过 SSH 直接操作,免去一切前置工作,一次 Playbook 搞定。
具体案例:某企业从自建机房迁移到公有云,运维团队编写 Ansible Playbook,在 2 小时内完成 200 台机器的环境变量切换与监控接入;迁移完成后,再交接给 Puppet 进行长期状态维护,形成“临时用 Ansible、稳态用 Puppet”的混合打法。
Python 演示
class Resource: """Chef 风格的资源声明:rtype + name + value。""" def __init__(self, rtype, name, value): self.rtype = rtype self.name = name self.value = value def key(self): return "{}::{}".format(self.rtype, self.name) def apply(self, node_state): current = node_state.get(self.key()) if current == self.value: return False # 幂等:已满足期望,不动作 node_state[self.key()] = self.value return True class Recipe: """一组资源声明,run 一次就是一轮收敛。""" def __init__(self, resources): self.resources = resources def run(self, node_state): changed = 0 for res in self.resources: if res.apply(node_state): changed += 1 return changed def main(): recipe = Recipe([ Resource("package", "nginx", "1.24"), Resource("service", "nginx", "running"), Resource("file", "/etc/nginx.conf", "v3"), ]) node = {"package::nginx": "1.20", "service::nginx": "stopped"} print("初始状态:", node) print("第 1 轮收敛变更数:", recipe.run(node), "->", node) print("第 2 轮收敛变更数:", recipe.run(node), "->", node) print("第 3 轮收敛变更数:", recipe.run(node)) print("结论: 重复执行结果一致, 具备幂等性") if __name__ == "__main__": main()
node_state.get(self.key())读取实际配置值,与期望值比对,这是收敛循环的“检测”环节if current == self.value: return False已满足期望就不动作,这就是幂等性的来源node_state[self.key()] = self.value不满足就收敛,把实际值修正为期望值Resource("package", "nginx", "1.24")声明一个资源:nginx 软件包应处于 1.24 版本Recipe([...])多个资源声明组成一份“配方”,run 一次就是一轮收敛for res in self.resources逐个资源执行“比对→修正”,记录变更数print("第 2 轮收敛变更数:", recipe.run(node))第二轮变更数为 0,证明重复执行结果一致
常见误区
误区我总觉得 Chef/Puppet 就是用来装软件、发版本的,跟 CI/CD 里的部署脚本没什么两样,跑完一次就完事了。
正解部署是把软件“装上去”的一次性动作,配置管理管的是“状态持续正确”。Chef/Puppet 的核心是声明期望状态 + 持续收敛,哪怕软件已经部署很久,只要配置漂移了,agent 也会在下一轮巡检中改回。打个比方:部署是“到达目的地”,配置管理是“保持到达且一直不走样”。
为何常见:因为最常见的配置管理动作确实是装包、启动服务,看起来和部署几乎一样,容易忽略背后的定期收敛机制。
误区既然是声明“要什么”,那我随便写资源顺序就好了,工具应该自动解决所有依赖关系吧?
正解声明式降低的是“如何做”的心智负担,但依赖关系仍需编排。Chef 用 run list 和依赖声明控制执行顺序,Puppet 提供资源间的 require/before 元参数。写法上不用写命令,但资源编排顺序的设计依然是一门功课——就像点菜不用教厨师切菜手法,但“先凉菜后热菜”的上菜顺序还是要交代。
为何常见:“声明式”三个字被过度简化,很多人误以为完全不用理解执行模型,结果在复杂依赖场景中翻车。
误区我身边都在用 Ansible,Chef 和 Puppet 是老古董了,不值得再花时间学。
正解Ansible 的上手体验确实最好,但 Puppet/Chef 在超大规模、离线收敛、合规留痕等场景仍是主流选择。大量金融、运营商、政企的核心集群至今由 Puppet/Chef 支撑。选型看场景,不看出身——流动顾问再方便,也替代不了常驻保安的 24 小时盯守。
为何常见:技术社区的热度容易被“新工具更好”的叙事带偏,忽略了存量生产环境的真实选择与迁移成本。
误区新机器装完系统后,跑一次配置脚本就完工了,后面不用再管。
正解配置管理真正的价值在于“长期对抗漂移”。运维过程中的手工改动、版本升级、安全加固都会引入偏差,agent 定时收敛才是常态价值。只用一次等于请了保安只在开业当天站岗——之后的门户大开,保安根本不知道。
为何常见:初学阶段容易把配置管理理解为“初始化工具”,没有建立持续收敛的时间维度。
误区幂等说明工具很聪明,跑得快、不浪费资源,是个性能指标。
正解幂等是指“重复执行结果一致”,重点在结果正确、可安全重放,与速度无关。一个幂等操作可能仍然要花时间做状态检查,但不会出现“执行两次配置就加倍”的副作用。就像收银员每笔结账前先核对小票,多花几秒,但绝不重复扣款——这是正确性,不是速度。
为何常见:把“不做无用功”等同于“快”,混淆了正确性属性与性能指标。
面试题
Q1. Chef 中描述“该把系统配成什么样”的最小可执行单元是?
- A.Recipe(配方指令)← 正确答案
- B.Playbook(剧本任务)
- C.Manifest(清单文件)
- D.Template(模板文件)
答案:A。Chef 的最小执行单元是 Recipe,多个 Recipe 组成 Cookbook。Playbook 是 Ansible 的概念,Manifest 是 Puppet 的概念,Template 只是渲染配置文件的辅助模板。
Q2. Puppet 中由若干个资源声明组成的期望状态文件称为?
- A.Cookbook(菜谱集)
- B.Module(功能模块)
- C.Manifest(清单文件)← 正确答案
- D.Resource(资源声明)
答案:C。Puppet 用 Manifest 描述期望状态,若干 Manifest 连同模板、测试打包成 Module。Cookbook 属于 Chef,Resource 是单个声明而非文件。
Q3. 配置漂移(Configuration Drift)指的是什么?
- A.磁盘空间随时间逐渐减少
- B.服务器实际状态偏离期望状态← 正确答案
- C.配置文件被定期自动删除
- D.网络延迟导致配置生效变慢
答案:B。漂移就是实际状态与期望状态的偏差。配置管理工具的使命正是检测并纠正漂移,其余选项描述的是完全不同的运维现象。
Q4. 幂等性的准确含义是?
- A.操作只能执行一次
- B.重复执行操作结果保持一致← 正确答案
- C.操作执行结果不可预测
- D.操作执行速度保持不变
答案:B。幂等要求 f(f(s)) = f(s),即“执行多次和一次结果相同”。它不是“只能执行一次”,而是“可安全重复执行”,这是声明式配置能定时重放的前提。
Q5. Puppet 主从架构中,Master 下发给 agent 的编译结果称为?
- A.Catalog(编译目录)← 正确答案
- B.Cookbook(菜谱合集)
- C.Playbook(任务剧本)
- D.Drift(配置漂移)
答案:A。Puppet Master 根据 Facts 和节点定义编译出 Catalog 下发给 agent。Cookbook 是 Chef 的概念,Playbook 是 Ansible 的概念。
Q6. 与 Chef/Puppet 的代理模式相比,Ansible 推送模式最主要的代价是?
- A.每台机器必须安装常驻代理
- B.控制端必须主动建立 SSH 连接← 正确答案
- C.不支持声明式的配置方式
- D.无法对 Linux 服务器管理
答案:B。无代理依赖 SSH 推送,控制端必须主动发起连接才能执行任务,缺少 agent 定时的离线收敛韧性。A 说反了,C、D 均不符合事实。
Q7. 在 Chef 的 C/S 架构中,Chef Server 承担的主要职责是?
- A.直接登录服务器现场执行
- B.存储 Cookbook 并响应节点拉取← 正确答案
- C.代替数据库保存业务数据
- D.为节点提供反向代理流量
答案:B。Chef Server 是中心仓库,存储 Cookbook 并响应各节点 chef-client 的拉取请求。它不直接登录节点执行命令,也不负责业务数据与流量转发。
Q8. 下列哪些属于 Chef 的核心概念?
- A.Cookbook(菜谱集)← 正确答案
- B.Manifest(清单文件)
- C.Resource(资源声明)← 正确答案
- D.Recipe(配方指令)← 正确答案
答案:ACD。Chef 的核心概念是 Recipe、Cookbook 与 Resource。Manifest 是 Puppet 的术语,这是两个工具最容易混淆的名词,务必区分。
Q9. 声明式配置与命令式脚本相比,有哪些优势?
- A.天然具备幂等性可重复执行← 正确答案
- B.只需描述期望状态即可← 正确答案
- C.完全摆脱依赖和顺序问题
- D.自动发现并修复配置漂移← 正确答案
答案:ABD。声明式的优势是幂等、描述期望、自动收敛。但 C 错误:依赖与顺序仍需编排(Chef 的 run list、Puppet 的元参数),只是表达方式从“步骤”变成了“声明”。
Q10. 下列哪些场景适合优先选择 Ansible?
- A.团队想快速上手无需装代理← 正确答案
- B.对几百台服务器临时批量改配置← 正确答案
- C.金融核心系统需要长期离线收敛
- D.目标主机无法安装常驻客户端← 正确答案
答案:ABD。Ansible 无代理、上手快、适合临时批量操作。C 描述的“长期离线收敛”恰是 Puppet/Chef 代理模式的优势,与 Ansible 的推送特性相反。