【问题标题】:How can I set the value of an attribute based on the environment I am in in Chef?如何根据我在 Chef 中的环境设置属性的值?
【发布时间】:2020-09-05 02:24:35
【问题描述】:

当我将更新推送到 chef 服务器时,我的更新首先被推送到我们的开发节点,然后我最终将它们合并到生产节点。

我有两个属性设置为数据库的 URL,但是,根据我是在开发节点还是生产节点,属性的值是不同的。

如何设置我的属性,以便根据它所处的环境设置属性的值?

这是我所拥有的:

default['test_cookbook']['Development']['URL]='jdbc:mysql://exampleDB1.com'
default['test_cookbook']['Production']['URL]='jdbc:mysql://exampleDB2.com'

理想情况下,我想要一些厨师资源,例如“node.chef_environment”,而不是“生产”和开发,它会检查环境并根据环境决定使用哪个 URL。

【问题讨论】:

    标签: chef-infra


    【解决方案1】:

    您可以在属性文件中执行此操作:

    default['test_cookbook']['Development']['URL']='jdbc:mysql://exampleDB1.com'
    default['test_cookbook']['Production']['URL']='jdbc:mysql://exampleDB2.com'
    

    然后在食谱的顶部将食谱的节点属性拉入一个 ruby​​ 变量并使用它:

    attributes = node['test_cookbook'][node.chef_environment]
    
    remote_file attributes['download_location'] do
      source attributes['URL']
    end
    
    template attributes['config_file'] do
      source "myapp.conf.erb"
      variables({ attributes: attributes })
    end
    

    还有一种优雅的方法可以通过 PolicyFiles 使用“提升”来执行此操作,其中 policy_group 替换 chef_environment,并且是推荐的前进方式:

    https://docs.chef.io/release_notes_client/#policyfile-hoisting

    【讨论】:

      【解决方案2】:

      理想情况下,Chef 属性不应以使用它们的环境命名。首选如下所示的与环境无关的属性:

      default['test_cookbook']['jdbc_url']
      

      TL;DR

      您可以通过属性文件实现您想要的。思路是根据node.chef_environment设置属性。

      例如test_cookbook/attributes/default.rb:

      default['test_cookbook']['jdbc_url'] = case node.chef_environment
        when 'development'
          'jdbc:mysql://exampleDB1.com'
        when 'production'
          'jdbc:mysql://exampleDB2.com'
        end
      

      但是...

      可以通过使用 knife environment edit 编辑环境或编辑该环境的 .json 文件来为每个 Chef 环境设置此变量的值。

      应该首选此方法,因为可以根据环境更改 JDBC URL,而无需修改说明书。 Cookbook 修改就像代码更改 - 涉及分支、版本碰撞以及相关的 README.mdCHANGELOG.md 更新、代码审查和合并。然后,这将在部署期间级联到使用“新”说明书版本。

      所有这些都是为了改变价值!不是首选。

      示例development Chef 环境:

        "default_attributes": {
          "test_cookbook": {
            "jdbc_url": "jdbc:mysql://exampleDB1.com"
          }
        },
      

      示例production Chef 环境:

        "default_attributes": {
          "test_cookbook": {
            "jdbc_url": "jdbc:mysql://exampleDB2.com"
          }
        },
      

      【讨论】:

      • 我是将这些添加到已经存在的“.json”文件还是为每个环境创建一个新文件?我在哪里告诉厨师使用 json 文件?
      • 我希望你的节点有“开发”和“生产”环境。您可以执行knife environment edit development 并添加属性。 “生产”也一样。
      猜你喜欢
      • 1970-01-01
      • 2013-11-23
      • 2020-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 2012-10-08
      相关资源
      最近更新 更多