在 Chef 里做环境隔离(Environment Isolation),核心思路是:用 Chef Environment 区分不同阶段(dev / test / prod 等),再结合 Role、Attribute、Policy/Policyfile、Data Bag(加密) 来控制差异。下面按“从传统到现代”的方式讲。
environments/production.rb
name "production"
description "Prod env"
default_attributes(
"app" => {
"log_level" => "warn"
}
)
override_attributes(
"app" => {
"feature_flag" => false
}
)
environments/development.rb
name "development"
description "Dev env"
default_attributes(
"app" => {
"log_level" => "debug"
}
)
knife node environment_set node1.example.com production
或在 bootstrap 时:
knife bootstrap ip -N node1 -E production
✅ 效果:
不同环境用不同 attribute,不改动 cookbook 代码。
典型结构:
Environment
└── 控制“环境级配置”
Role
└── 控制“节点类型配置”
示例:
web_server Roleproduction Environment 覆盖数据库连接串override_attributes(
"db" => {
"host" => "db.prod.internal"
}
)
如果你用 Chef Workstation + Chef Infra Server(现代做法):
policyfiles/web-prod.rb
name "web"
environment "production"
run_list "role[web_server]"
cookbook "nginx", "= 2.0.0"
policyfiles/web-dev.rb
name "web"
environment "development"
run_list "role[web_server]"
cookbook "nginx", "= 2.1.0"
chef install web-prod.rb
chef push prod web-prod.lock.json
✅ 优点:
knife data bag create secrets db --secret-file secret.pem
{
"id": "db",
"production": {
"password": "supersecret"
}
}
Cookbook 中:
db_pass = data_bag_item('secrets', 'db')['production']['password']
✅ 避免环境密码泄露
Node Attribute
> Environment Override
> Role Override
> Cookbook Default
| 场景 | 推荐方式 |
|---|---|
| 配置差异 | Environment |
| 版本隔离 | Policyfile |
| 多租户 | Environment + Data Bag |
| 强合规 | Policyfile + Encrypted Data Bag |
如果你愿意,我可以:
你现在是用的 Chef Server 还是 Chef Zero?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。