在 Chef 里做环境隔离(Environment Isolation),核心目标通常是:
不同环境(dev / test / staging / prod)使用不同的配置、版本、密钥,但共用同一套 Cookbook 代码。
下面从概念到实践系统讲一下。
Chef Environment 是一个逻辑分组对象,用来:
⚠️ 注意:
Environment 不是网络隔离,也不隔离 Chef Server 本身,它只是配置和版本层面的隔离。
environments/dev.rb
name "dev"
description "Development environment"
# 属性覆盖
default_attributes(
"app" => {
"log_level" => "debug",
"db_host" => "dev-db.example.com"
}
)
# Cookbook 版本锁定
cookbook "nginx", "= 2.7.0"
cookbook "myapp", "= 1.0.0"
environments/prod.rb
name "prod"
description "Production environment"
default_attributes(
"app" => {
"log_level" => "warn",
"db_host" => "prod-db.example.com"
}
)
cookbook "nginx", "= 3.1.0"
cookbook "myapp", "= 2.3.0"
knife environment from file dev.rb
knife environment from file prod.rb
方式一:Bootstrap 时指定
knife bootstrap 10.0.0.10 \
-N web-dev-01 \
-E dev \
-r "role[web]"
方式二:修改已有节点
knife node environment set web-dev-01 dev
Chef 属性优先级(由低到高):
attributes/default.rbdefault_attributesdefault_attributesnormaloverride_attributes(最高之一)✅ 推荐做法:
environment override_attributes适合:
Chef Server
├── org-dev
└── org-prod
优点:
缺点:
Chef 官方更推荐 Policyfile:
name "myapp"
run_list "recipe[myapp::default]"
default_source :chef_repo, "../cookbooks"
# 环境隔离体现在 policy group
chef install
chef push dev
chef push prod
✅ 优点:
| 用途 | 用 Role | 用 Environment |
|---|---|---|
| 服务器类型 | ✅ | ❌ |
| 环境差异 | ❌ | ✅ |
| 版本锁定 | ❌(不推荐) | ✅ |
❌ 在 Cookbook 里写死环境判断
if node.chef_environment == "prod"
✅ 正确方式:用属性 + Environment 覆盖
❌ 只用 node.chef_environment 做逻辑分支
→ 不利于测试和复用
✅ 小团队
Environment + Role
✅ 中大型 / 自动化强
Policyfile + Environment Group
✅ 强合规 / 多租户
多 Organization
如果你愿意,我可以:
你现在是用的 Chef Infra Server + knife 还是 Chef Workstation + Policyfile?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。