在 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 服务器,则返回服务器。