【问题标题】:How can I override an attribute on a node with Chef?如何使用 Chef 覆盖节点上的属性?
【发布时间】:2018-07-31 06:53:30
【问题描述】:

我们有一个 Chef 环境设置。我们的部署工作正常,节点属性被角色和环境正确覆盖。

为了测试即将发生的更改,我们希望更改部署中 1 个特定节点的设置。我们不想为该测试编写不同的配方、角色或环境,因为实际上只有 1 个设置不同。

我尝试通过 Chef Manage 的 Web UI 并将特定节点的属性设置如下:

{
    "tags": null,
    "our_app":{
        "url": "http://test-server"
    }
}

在我们的食谱中,attributes/default.rb 设置如下:

default[:our_app][:url] = ''

在我们的环境文件中,我们覆盖如下设置:

override_attributes({
    "our_app" => {
        "url" => "http://default-server",
    }
})

我们在配方中使用以下.erb 模板:

{
    "serverUrl": "<%= node[:our_app][:url]%>"
}

但是,当我们在该节点上运行 chef-client 时,它仍然在输出中以 http://default-server 结束。

我了解 attribute precedence as explained in the docs 。但我不确定如何实现我想要的。

我应该在我的环境文件中使用override_attributes() 吗?

有没有办法拥有一个节点特定的覆盖属性

【问题讨论】:

    标签: chef-infra chef-attributes


    【解决方案1】:

    不,没有办法拥有特定于节点的覆盖。特定于节点的数据始终(也是唯一的)normal 级别。一般来说,您根本不应该使用覆盖级别,当然也不应该使用自称为默认值的东西。

    此外,我们真的建议不要再使用角色/环境。您应该尽快切换到 Policyfile 系统。

    【讨论】:

    • 谢谢。不幸的是,我几乎无法控制 IT 当前的设置,而我们当前的标准是角色/环境。所以我正在努力解决这个问题。我尝试将我的环境文件更改为 default_attributes() 并设置节点的 override 属性。但这似乎也不起作用。覆盖显示在 knife edit -a 命令和 knife show -l 中,但似乎没有被使用。
    • 你不能设置节点的覆盖属性,它没有这样的东西。您会在节点对象中看到回显的数据,该数据在成功收敛结束时从节点保存回来,用于 search() 和报告内容,但它不是输入。只有角色、环境和说明书可以设置在覆盖级别。
    • 所以我无法在 env/roles/recipes 中强制执行 1 个特定节点的节点属性?
    • 有,但前提是您已经小心地将大多数 attrs 设置为 default 级别,您应该这样做。 override 仅用于紧急情况,如 CSS 中的 !important
    • 像往常一样把它放在节点对象的normal级别。那是“高于”default,它将优先考虑。
    猜你喜欢
    • 2016-02-29
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多