Chef infra 从属性文件访问厨师数据包

Chef infra 从属性文件访问厨师数据包,chef-infra,databags,Chef Infra,Databags,是否有办法从default.rbattributes文件中访问厨师数据包 我的用例是,我需要将操作系统环境变量的集合表示为属性的散列,这些属性最终传递给模板。其中一些环境变量是我存储在加密数据包中的凭证。不幸的是,Chef不允许我从属性文件中访问配方DSL,因此我通常使用的data\u bag\u item方法不可用 提前感谢。为什么不能从数据包中设置配方中的属性,并按预期使用。通常,我会在attributes/default.rb中为相同的值设置一个默认值,以防数据包在运行时不存在 在属性文件

是否有办法从
default.rb
attributes文件中访问厨师数据包

我的用例是,我需要将操作系统环境变量的集合表示为属性的散列,这些属性最终传递给模板。其中一些环境变量是我存储在加密数据包中的凭证。不幸的是,Chef不允许我从属性文件中访问配方DSL,因此我通常使用的
data\u bag\u item
方法不可用


提前感谢。

为什么不能从数据包中设置配方中的属性,并按预期使用。通常,我会在
attributes/default.rb
中为相同的值设置一个默认值,以防数据包在运行时不存在

在属性文件中:

default['cookbook_name']['secret_value'] = '__UNDEFINED__'
然后在配方中按预期填写并引用属性:

node.default['cookbook_name']['secret_value'] = data_bag_item('something', 'else')

属性文件用作存储属性的位置。一旦配方被编译,最终结果将被安排运行。值的来源在那一点上并不重要。

您不能使用DSL帮助程序,但可以直接使用
Chef::dataagitem.load
自己加载。查看Chef代码以了解如何使用它(我们不会记录这些API)。

这是一个很好的答案,但这是因为配方是通用的。它循环一系列要部署的东西,其中只有一些需要凭据环境变量。所以我希望在属性文件中保持专业化。每个属性的lambdas如何,然后在配方中调用。这将使代码在逻辑上保留在属性文件中,即使它在配方中执行。按照
default['cookbook\u name']['secret\u value']=lambda{data\u bag\u item('something','else')}
的思路思考。属性文件仍然是Ruby,因此如果在配方中使用
进行求值,它应该可以运行。需要时调用
节点['whatever']=value
将在chef 12.8中抛出错误(至少),首选
节点。默认['whatever']=value
@KenBrittain如何使用密钥解密数据库项??IIRC,我们通常将机密文件放到
/etc/chef/secret
中,并使用第三个参数来
数据包项目
示例:虽然您可能没有配方DSL,但我不认为有任何禁止调用各种方法的规定,例如。正如其他海报所说,最好在属性文件中给出默认值,并使用配方加载数据包。