问题描述
对于使用Chef的新手来说,编写用于工作中使用的Kiosk的菜谱(recipes)。为这些Kiosk创建了一个角色(role),其中包含一组属性(attributes)。然而,这些属性中有一个是唯一的标识符(ID),对于每个Kiosk节点都是不同的。这个ID由我们的客户提供,是任意的,不能自动生成。
在这种情况下,怎么设置这个唯一的标识符的值?我正在使用Chef Server,并且正在考虑最好的方式可能是在引导(Bootstrap)时进行设置,但不太确定具体应该如何操作。
解决方案
请注意以下操作可能因版本不同而有所差异。
在Chef中,为了设置每个Kiosk节点的唯一标识符,你可以考虑以下几种方法。以下是其中的一些建议:
方法1:手动编辑节点属性
- 使用
knife edit
命令编辑特定节点的属性。例如,你可以运行以下命令来编辑名为node_name
的节点:
bash
knife edit node node_name - 在打开的编辑器中,设置一个特定的属性,比如唯一的标识符。这个属性将只会分配给这个节点。
- 保存并退出编辑器。
方法2:创建包装 cookbook
- 创建一个名为
wrapper
的新 cookbook,作为原始 cookbook 的包装。 - 在
wrapper
cookbook 中,创建一个属性文件,例如attributes/default.rb
,用于重写原始 cookbook 中的属性。 - 在这个属性文件中,设置唯一的标识符属性,以覆盖原始 cookbook 中的相应属性。例如:
ruby
default['original_cookbook']['unique_id'] = 'your_unique_id_here' - 在
wrapper
cookbook 的其他部分中,可以根据需要引用或修改原始 cookbook 中的其他内容。 - 将
wrapper
cookbook 应用到你的 Kiosk 节点上。
方法3:引导时传递 JSON 文件
- 创建一个 JSON 文件,例如
first-boot.json
,在其中设置唯一的标识符属性。例如:
json
{
"original_cookbook": {
"unique_id": "your_unique_id_here"
}
} - 在引导(Bootstrap)或第一次运行 Chef 客户端时,使用
-j
选项来传递这个 JSON 文件。例如:
bash
chef-client -j /etc/chef/first-boot.json - 这将使 Chef 客户端在第一次运行时使用你指定的属性值。
无论哪种方法,都需要确保你在属性中使用正确的命名空间和属性名称,以便在角色中引用它们。
以上是一些可能的方法,你可以根据你的具体情况选择适合你的方法来设置每个Kiosk节点的唯一标识符属性。根据你的需求和实际情况,选择最适合的方式来管理和设置这些属性值。
正文完