Ruby 我可以在chef节点属性数组上使用sort和uniq吗?

Ruby 我可以在chef节点属性数组上使用sort和uniq吗?,ruby,chef-infra,Ruby,Chef Infra,我们有一个生成bash脚本的模板,其中包括一个基于节点属性(特别是分配给节点的角色)检查的修补程序列表 patchlist=( <%= node['oracledb']['install']['oneoff']['db_oo_apply'] rescue nil %> <%= node['oracledb']['install']['oneoff']['db_psu_num'] rescue nil %> ) 如果所有属性都有值,则该选项有效 但似乎发生的是,如果列表中

我们有一个生成bash脚本的模板,其中包括一个基于节点属性(特别是分配给节点的角色)检查的修补程序列表

patchlist=( <%= node['oracledb']['install']['oneoff']['db_oo_apply'] rescue nil %> <%= node['oracledb']['install']['oneoff']['db_psu_num'] rescue nil %> )
如果所有属性都有值,则该选项有效

但似乎发生的是,如果列表中的任何一个属性为空,则
rescue nil
将启动,整个数组返回为nil

我认为在第一个变量中,
rescue nil
的范围仅限于特定属性,但在第二个变量中,它适用于整个字符串


那么,我能以某种方式构建这个数组,让它排序并保持唯一性,并且仍然控制数组中单个元素可能为空的情况吗?

只需使用纯ruby即可,例如:

irb(main):001:0>([nil]+[2,1]).compact.uniq.sort
=> [1, 2]

简言之,将数组连接到一个新数组中,
compact
it以获取一个已连接数组的副本,并删除所有
nil
元素,然后应用
uniq
sort

,只需使用纯ruby即可,例如:

irb(main):001:0>([nil]+[2,1]).compact.uniq.sort
=> [1, 2]

简而言之,将数组连接到一个新数组中,
compact
it以获取一个已连接数组的副本,并删除所有
nil
元素,然后应用
uniq
sort

实现这一点的一种方法是创建节点属性的实际数组。在您当前的实现中,它不是数组,只是由空格分隔的属性

这在模板上有点逻辑过载,但应该可以工作

模板示例:


实现这一点的一种方法是创建节点属性的实际数组。在您当前的实现中,它不是数组,只是由空格分隔的属性

这在模板上有点逻辑过载,但应该可以工作

模板示例:


在厨师配方中执行属性逻辑并仅使用ERB呈现计算变量如何?在厨师配方中执行属性逻辑并仅使用ERB呈现计算变量如何?可能不需要执行
p.nil?
检查,因为数组的
nil
元素似乎被忽略无论如何。
p.nil?
检查可能不需要,因为数组的
nil
元素似乎被忽略了。
patchlist=( <%= ( node['oracledb']['install']['oneoff']['db_oo_apply'] + ' ' + node['oracledb']['install']['oneoff']['db_psu_num'] rescue nil).split(' ').uniq.sort.join(' ') %> )