我希望基于环境覆盖角色的属性,就像我可以使用env_run_lists根据环境覆盖角色的run_list一样。
就我而言,它适用于Nagios检查。我需要一个默认检查,但我也希望不同类型的机器(使用角色)具有不同级别的检查,PLUS我希望根据角色对不同环境进行不同级别的检查。
理想情况下,我想在机器类型的角色中使用类似的东西(在Web服务器角色中使用“env_attributes”的假设指令:
name "webserver"
description "A machine that serves webs"
env_attributes (
"_default" => [
"nagios" => [
"check_interval" => "60"
"retry_interval" => "3
]
],
"CompanyStackA" => [
"nagios" => [
"check_interval" => "10"
"retry_interval" => "2
]
],
"CompanyStackB" => [
"nagios" => [
"check_interval" => "50"
"retry_interval" => "1
]
]
)
我不想要做的是为每种机器类型编写属性,默认是必不可少的,所以我宁愿不为实际环境中的所有角色设置一组属性。什么是最简单的方法?如果可以用于运行列表,似乎无法通过角色+环境覆盖属性似乎是一种疏忽。
答案 0 :(得分:1)
Opscode建议的方法是在个人食谱中实现这一点。他们的理由是,它将所有逻辑都包含在食谱本身中,而不是分散在角色,烹饪书和环境中。
您可以专门创建一本食谱来覆盖您尝试设置的属性。使用此模型,配方的default.rb可能包含以下内容:
if node.run_list.roles.include?('webserver')
if node.environment == 'CompanyStackA'
node.override['nagios']['check_interval'] = "10"
node.override['nagios']['retry_interval'] = "2"
else if node.environment == 'CompanyStackB'
node.override['nagios']['check_interval'] = "50"
node.override['nagios']['retry_interval'] = "1"
else
node.override['nagios']['check_interval'] = "60"
node.override['nagios']['retry_interval'] = "3"
end
end
这是一个指向Opscode票据的链接,他们拒绝了类似的想法,理由是它应该包含在各个Cookbook中:Support for enviroment attributes in roles