在角色中按环境覆盖属性

时间:2014-03-18 11:25:42

标签: chef

我希望基于环境覆盖角色的属性,就像我可以使用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
      ]
   ]
)

我不想要做的是为每种机器类型编写属性,默认是必不可少的,所以我宁愿不为实际环境中的所有角色设置一组属性。什么是最简单的方法?如果可以用于运行列表,似乎无法通过角色+环境覆盖属性似乎是一种疏忽。

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