温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Chef脚本怎么写才规范

发布时间:2026-10-03 08:05:45 来源:亿速云 阅读:96 作者:小樊 栏目:系统运维

Chef 是基础设施即代码(IaC)领域非常成熟的配置管理工具,写“规范”的 Chef 脚本(通常称为 Cookbook / Recipe)核心在于:结构清晰、幂等、可复用、可读、可测试。

下面从目录结构、Recipe 写法、资源使用、属性管理、测试与规范几个方面系统讲一下。


一、标准 Cookbook 目录结构(规范基础)

my_cookbook/
├── attributes/
│   └── default.rb
├── recipes/
│   └── default.rb
├── templates/
│   └── default/
│       └── app.conf.erb
├── files/
├── libraries/
├── resources/        # 自定义资源(modern Chef)
├── providers/        # 老式写法(不推荐)
├── metadata.rb
├── Berksfile
└── test/
    └── integration/

✅ 规范点

  • 一个 Cookbook 只做一件事(单一职责)
  • 不使用 provider/resource 老式写法,优先用 Custom Resources

二、Recipe 编写规范(最重要)

1️⃣ 幂等性(必须)

❌ 错误示例:

execute 'start service' do
  command 'systemctl start nginx'
end

✅ 正确示例:

service 'nginx' do
  action [:enable, :start]
end

✅ 原则

  • 不写 execute 除非必要
  • 使用内置资源(package / service / template / file)

2️⃣ 使用 Resource 而非脚本

❌:

bash 'install app' do
  code <<-EOF
    curl xxx | bash
  EOF
end

✅:

package 'app' do
  action :install
end

3️⃣ Recipe 保持“声明式”

✅ 推荐:

template '/etc/app.conf' do
  source 'app.conf.erb'
  owner 'root'
  group 'root'
  mode '0644'
  notifies :restart, 'service[app]'
end

✅ 不要写流程控制逻辑(if/unless 尽量少)


三、属性(Attributes)规范

attributes/default.rb

default['myapp']['port'] = 8080
default['myapp']['user'] = 'appuser'

✅ 规范:

  • 使用 namespace(cookbook['key'])
  • 不在 Recipe 中硬编码变量

四、自定义 Resource(现代 Chef 推荐)

# 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

✅ 优势

  • 可复用
  • 易测试
  • 符合 Chef 12+ 规范

五、metadata.rb 规范

name             'my_cookbook'
version          '1.0.0'
chef_version     '>= 15.0'
depends          'nginx'

✅ 明确依赖,避免隐式依赖


六、模板(Template)规范

# templates/default/app.conf.erb
port = <%= node['myapp']['port'] %>

✅ 使用 node['cookbook']['key'] ❌ 不要直接写死配置


七、测试规范(专业级)

1️⃣ 单元测试(ChefSpec)

describe 'my_cookbook::default' do
  it 'installs nginx' do
    expect(chef_run).to install_package('nginx')
  end
end

2️⃣ 集成测试(Test Kitchen + InSpec)

describe service('nginx') do
  it { should be_running }
end

八、常见不规范写法(避坑)

不规范 规范
写 bash 脚本 用 resource
Recipe 里大量 if 用 attribute
一个 cookbook 做所有事 拆分 cookbook
execute 启动服务 service 资源
硬编码 IP/端口 node 属性

九、总结一句话

规范的 Chef 脚本 = 声明式资源 + 幂等设计 + 清晰结构 + 可测试

如果你愿意,我可以:

  • 帮你 review 一段现有 Chef 脚本
  • 给你一个 标准 Cookbook 模板
  • 或按 生产级规范写一个示例(如 Nginx / Java / Docker)

直接发代码或需求就行。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手