Chef 11 节点属性可用及排序

Chef 11 节点属性可用及排序

在 Chef 10 中,我有许多角色可以设置自定义节点属性,例如

"appname": "my_rails_app"

然后使用该属性在包装器食谱中加载应用程序特定的变量。例如,每个 Rails 应用程序都有不同的变量和变量数量。

app = Chef::EncryptedDataBagItem.load('deploy', node.appname)

在 Chef 11 中,我的运行失败,因为“node.appname”直到 Chef 成功运行后才设置。这意味着服务器创建变成了一个 2 步过程 - 使用基本角色启动,然后引导包装器食谱。

我理解为什么改变这种行为,但我很好奇如何在不重写我的食谱的情况下解决这个问题,并且仍然坚持 DRY。

更新

谢谢,这很有趣,但我不确定这是否可行。例如,通用部署手册也依赖于 appname,包含在 my_rails_app 配方中。因此运行看起来像

角色 - 设置属性的位置

"appname": "my_rails_app"

应用程序包装器手册 - 加载变量

include_recipe "deploy"
app = Chef::EncryptedDataBagItem.load('deploy', node.appname)

部署 cookbook - 加载 SSH 密钥

app = Chef::EncryptedDataBagItem.load('deploy', node.appname)

部署食谱会终止 Chef 运行。

答案1

在 chef 客户端运行期间,可以使用以下命令再次解析已经在 cookbooks 属性文件中定义的默认属性node.from_file

# set the attribute
node.set[:appname] = "my_rails_app"

# optionally reload node so attribute is available during this chef-client run
node.from_file( run_context.resolve_attribute('your-railapp-cookbook', 'default') )

# and log it. 
Chef::Log.info( "appname [#{node[:appname]}]" )

这段摘自我对使用属性的回答

如果你正在这样做,你可能需要考虑保存节点如果这是您流程中足够重要的检查点,以保证额外调用回 chef 服务器,则返回服务器。

相关内容