Chef 是基础设施即代码(IaC)领域非常成熟的配置管理工具,写“规范”的 Chef 脚本(通常称为 Cookbook / Recipe)核心在于:结构清晰、幂等、可复用、可读、可测试。
下面从目录结构、Recipe 写法、资源使用、属性管理、测试与规范几个方面系统讲一下。
my_cookbook/
├── attributes/
│ └── default.rb
├── recipes/
│ └── default.rb
├── templates/
│ └── default/
│ └── app.conf.erb
├── files/
├── libraries/
├── resources/ # 自定义资源(modern Chef)
├── providers/ # 老式写法(不推荐)
├── metadata.rb
├── Berksfile
└── test/
└── integration/
✅ 规范点
provider/resource 老式写法,优先用 Custom Resources❌ 错误示例:
execute 'start service' do
command 'systemctl start nginx'
end
✅ 正确示例:
service 'nginx' do
action [:enable, :start]
end
✅ 原则
execute 除非必要❌:
bash 'install app' do
code <<-EOF
curl xxx | bash
EOF
end
✅:
package 'app' do
action :install
end
✅ 推荐:
template '/etc/app.conf' do
source 'app.conf.erb'
owner 'root'
group 'root'
mode '0644'
notifies :restart, 'service[app]'
end
✅ 不要写流程控制逻辑(if/unless 尽量少)
default['myapp']['port'] = 8080
default['myapp']['user'] = 'appuser'
✅ 规范:
cookbook['key'])# resources/service.rb
resource_name :myapp_service
property :port, Integer, default: 8080
action :create do
template '/etc/myapp.conf' do
source 'myapp.conf.erb'
variables(port: new_resource.port)
end
end
使用:
myapp_service 'default' do
port 9090
end
✅ 优势
name 'my_cookbook'
version '1.0.0'
chef_version '>= 15.0'
depends 'nginx'
✅ 明确依赖,避免隐式依赖
# templates/default/app.conf.erb
port = <%= node['myapp']['port'] %>
✅ 使用 node['cookbook']['key']
❌ 不要直接写死配置
describe 'my_cookbook::default' do
it 'installs nginx' do
expect(chef_run).to install_package('nginx')
end
end
describe service('nginx') do
it { should be_running }
end
| 不规范 | 规范 |
|---|---|
| 写 bash 脚本 | 用 resource |
| Recipe 里大量 if | 用 attribute |
| 一个 cookbook 做所有事 | 拆分 cookbook |
| execute 启动服务 | service 资源 |
| 硬编码 IP/端口 | node 属性 |
规范的 Chef 脚本 = 声明式资源 + 幂等设计 + 清晰结构 + 可测试
如果你愿意,我可以:
直接发代码或需求就行。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。