【发布时间】:2020-12-06 00:36:13
【问题描述】:
我们有一个生成 bash 脚本的模板,其中包括要根据节点属性(特别是分配给节点的角色)检查的补丁列表。
patchlist=( <%= node['oracledb']['install']['oneoff']['db_oo_apply'] rescue nil %> <%= node['oracledb']['install']['oneoff']['db_psu_num'] rescue nil %> )
我已经剪掉了一些实际的列表,但你明白了。
问题是这些属性之间可能存在重复条目,因此我们希望对它们进行排序并获得一个唯一列表。
此外,更复杂的是,并非每个环境中的所有节点都具有这些属性 - 这就是我们将rescue nil 撒在其中的原因。
我可以将数组构建为
patchlist=( <%= ( node['oracledb']['install']['oneoff']['db_oo_apply'] + ' ' + node['oracledb']['install']['oneoff']['db_psu_num'] rescue nil).split(' ').uniq.sort.join(' ') %> )
如果所有属性都有值,那么它会起作用。
但似乎发生的情况是,如果列表中的任何单个属性为空,rescue nil 就会启动并且整个数组返回为 nil。
我认为在第一个变体中,rescue nil 的范围仅限于特定属性,但在第二个变体中,它适用于整个字符串。
那么,我能否以某种方式构建这个数组,让它排序且唯一,并且仍然控制数组中单个元素可能为空的情况?
【问题讨论】:
-
如何在厨师食谱中执行属性逻辑并仅使用 ERB 来渲染计算变量?
标签: ruby chef-infra