大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
Chef 与 Salt
Chef 与 Salt 都是成熟的 Master-Agent(或 Masterless) 配置管理工具:Chef 以 Ruby DSL Recipe 著称,Salt 以 YAML State + 高速消息总线 见长。二者都支持 声明式 描述期望状态,在企业裸机与混合云 VM 场景仍广泛使用。本课衔接 dcp-intro 的 CM 概念,并与 terraform-essentials 创建的 VM 对接;容器层见 kubernetes-essentials,云选型见 devops-cloud-essentials。
学习目标
- 读懂 Chef Cookbook / Recipe / Resource 结构与 Chef Server 工作流
- 理解 Salt State SLS、Grain、Pillar 与
salt '*' state.apply推送模型 - 对比 Chef 与 Salt 在语言、扩展性、学习曲线上的差异
Chef 核心模型
# recipes/default.rb — 安装并启动 Nginx
package 'nginx' do
action :install
end
service 'nginx' do
action [:enable, :start]
subscribes :restart, 'template[/etc/nginx/nginx.conf]', :delayed
end
template '/etc/nginx/nginx.conf' do
source 'nginx.conf.erb'
variables(server_name: 'coderoadmap.local')
notifies :restart, 'service[nginx]', :delayed
end
# metadata.rb 片段
name 'coderoadmap_nginx'
version '1.0.0'
depends 'nginx', '~> 9.0'
Chef Infra Server 存 Cookbook 与 Node 对象;Agent(chef-client)周期拉取 Run List 并收敛。Test Kitchen + InSpec 常用于 Cookbook 测试。
Salt 核心模型
# salt/nginx/init.sls
nginx_pkg:
pkg.installed:
- name: nginx
nginx_service:
service.running:
- name: nginx
- enable: True
- require:
- pkg: nginx_pkg
nginx_config:
file.managed:
- name: /etc/nginx/conf.d/coderoadmap.conf
- source: salt://nginx/files/coderoadmap.conf.jinja
- template: jinja
- context:
upstream: "{{ pillar['backend_host'] }}:8080"
- watch_in:
- service: nginx_service
# pillar/coderoadmap.sls(敏感/环境差异放 Pillar)
backend_host: 127.0.0.1
env: staging
Salt Master 通过 ZeroMQ 或 TCP 与 Minion 通信;Pillar 类似 Chef 的 data bag / role 变量,Grain 是 Minion 自动采集的静态事实(OS、IP)。
Chef vs Salt 速查
| Chef | Salt | |
|---|---|---|
| DSL | Ruby | YAML + Jinja |
| 架构 | Chef Server + client | Salt Master + Minion |
| 强项 | 复杂逻辑、生态 Cookbook | 批量命令、远程执行快 |
| 无 Master | chef-solo / chef-zero | salt-ssh |
在 /roadmaps/devops 的 configuration-management 分支,Chef/Salt 代表 「重型 CM + 丰富社区模块」 路线;下一课 Puppet 则是另一种 Master-Agent 范式。
练习
- 用 Chef Recipe 或 Salt SLS 描述「安装 OpenJDK 17 + 创建
coderoadmap系统用户」 - 说明 CodeRoadMap backend 的
application.yml更适合放 Chef template 还是 Salt Pillar,并写出理由 - 对比
chef-client周期拉取与salt '*' state.apply主动推送的运维场景差异
小结
Chef 用 Ruby Recipe 表达资源;Salt 用 YAML State + Pillar 做高速收敛。 二者都是声明式 CM 的代表,选型看团队语言栈与批量运维需求。下一课深入 Puppet 的 Manifest 与 Master-Agent 模型。