在Chef中设置唯一的节点属性

85次阅读
没有评论

问题描述

对于使用Chef的新手来说,编写用于工作中使用的Kiosk的菜谱(recipes)。为这些Kiosk创建了一个角色(role),其中包含一组属性(attributes)。然而,这些属性中有一个是唯一的标识符(ID),对于每个Kiosk节点都是不同的。这个ID由我们的客户提供,是任意的,不能自动生成。

在这种情况下,怎么设置这个唯一的标识符的值?我正在使用Chef Server,并且正在考虑最好的方式可能是在引导(Bootstrap)时进行设置,但不太确定具体应该如何操作。

解决方案

请注意以下操作可能因版本不同而有所差异。
在Chef中,为了设置每个Kiosk节点的唯一标识符,你可以考虑以下几种方法。以下是其中的一些建议:

方法1:手动编辑节点属性

  1. 使用knife edit命令编辑特定节点的属性。例如,你可以运行以下命令来编辑名为node_name的节点:
    bash
    knife edit node node_name
  2. 在打开的编辑器中,设置一个特定的属性,比如唯一的标识符。这个属性将只会分配给这个节点。
  3. 保存并退出编辑器。

方法2:创建包装 cookbook

  1. 创建一个名为wrapper的新 cookbook,作为原始 cookbook 的包装。
  2. wrapper cookbook 中,创建一个属性文件,例如attributes/default.rb,用于重写原始 cookbook 中的属性。
  3. 在这个属性文件中,设置唯一的标识符属性,以覆盖原始 cookbook 中的相应属性。例如:
    ruby
    default['original_cookbook']['unique_id'] = 'your_unique_id_here'
  4. wrapper cookbook 的其他部分中,可以根据需要引用或修改原始 cookbook 中的其他内容。
  5. wrapper cookbook 应用到你的 Kiosk 节点上。

方法3:引导时传递 JSON 文件

  1. 创建一个 JSON 文件,例如first-boot.json,在其中设置唯一的标识符属性。例如:
    json
    {
    "original_cookbook": {
    "unique_id": "your_unique_id_here"
    }
    }
  2. 在引导(Bootstrap)或第一次运行 Chef 客户端时,使用-j选项来传递这个 JSON 文件。例如:
    bash
    chef-client -j /etc/chef/first-boot.json
  3. 这将使 Chef 客户端在第一次运行时使用你指定的属性值。

无论哪种方法,都需要确保你在属性中使用正确的命名空间和属性名称,以便在角色中引用它们。

以上是一些可能的方法,你可以根据你的具体情况选择适合你的方法来设置每个Kiosk节点的唯一标识符属性。根据你的需求和实际情况,选择最适合的方式来管理和设置这些属性值。

正文完