【问题标题】:Using attributes in Chef Solo JSON在 Chef Solo JSON 中使用属性
【发布时间】:2018-07-02 23:54:51
【问题描述】:

是否可以在 Chef Solo 的 JSON 中指定属性值?我有一个带有运行列表的 solo.json,我想在那里指定属性。 Chef 文档似乎表明我应该可以执行以下操作:

{
    "hostname": {
        "test": "value2"
    },
    "default_attributes": {
        "hostname": {
            "test": "value3"
        }
    },
    "override_attributes": {
        "hostname": {
            "test": "value4"
        }
    },
    "default": {
        "hostname": {
            "test": "value5"
        }
    },
    "run_list": [
        "recipe[hostname::default]"
    ]
}

但是,每当我尝试访问我的配方中的值时:

p node['hostname']['test']

我只是得到了 attributes/default.rb 中定义的值,如果我没有在那里定义它,我会得到一个 nil 值。

有没有办法引用这些值?

【问题讨论】:

  • 一种更简单的方法(至少对我而言)是创建一个“覆盖”食谱,其中只有一个带有 node.override 值的属性文件,然后运行 ​​chef-solo -c ~/.chef/solo.rb -j ~/.chef/solo.json -o my_overrides_cookbook,recipe[recipe_to_run] 以确保它覆盖您的默认值跨度>

标签: chef-infra chef-solo


【解决方案1】:

您可以存储在节点数据中的唯一属性级别是normal,其他所有内容在融合开始时重置并从角色、环境和说明书重建。你想要看起来像这样的东西:

{
  "normal": {
    "hostname": {
      "test": "something"
    }
  },
  "run_list": [
    "recipe[hostname::default]"
  ]
}

【讨论】:

    【解决方案2】:

    跟进:

    不使用 Chef Solo 设置 JSON 文件中的属性优先级。 JSON 应该类似于:

    {
      "name": "my_json_file",
      "description": "JSON run-list and attributes.",
      "my_cookbook": {
        "git_branch": "staging"
      },
      "run_list": [
        "recipe[my_cookbook::recipe1]",
        "recipe[my_cookbook::recipe2]",
      ]
    }
    

    不包括"normal": {...}"default_attributes": {...}等,将传递属性供chef-solo使用。

    【讨论】:

    • 感谢您的提示。对于 chef-solo ,在从角色文件中删除 "default_attributes": {...} 之后,厨师独奏尊重所有属性,这些属性是该角色文件的一部分。
    【解决方案3】:

    我尝试使用上述示例在 chef-solo 的 JSON 文件中设置属性,而 "normal": {...} 块被完全忽略。已读取运行列表,但属性似乎从未起作用。

    我的命令是:

    chef-solo -c /path/to/config_file.rb -j /path/to/file.json
    

    我的 JSON 文件:

    {
      "name": "my_json_file",
      "description": "JSON run-list and attributes.",
      "normal": {
        "my_cookbook": {
          "git_branch": "staging"
        }
      },
      "run_list": [
        "recipe[my_cookbook::recipe1]",
        "recipe[my_cookbook::recipe2]",
      ]
    }
    

    在收敛期间,Chef 直接回到 attributes/default.rb 中的默认值。是否正确输入了 JSON 值?到目前为止,我唯一的解决方法是为要使用 chef-solo 测试的每个 "git_branch": 属性创建一个新配方,并将更新后的运行列表添加到不同的 JSON 文件中。本质上,复制整个配方以更改单个 node.normal['my_cookbook']['git_branch'] 值。不用说,这不应该是一个解决方案。

    使用 Chef 14.0.202

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-21
      相关资源
      最近更新 更多