ruby - 我可以在厨师节点属性数组上使用 sort 和 uniq 吗?
问题描述
我们有一个生成 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
仅限于特定属性,但在第二个变体中,它适用于整个字符串。
那么,我能以某种方式构建这个数组,让它排序和唯一,并且仍然控制数组中单个元素可能为空的情况吗?
解决方案
实现此目的的一种方法是创建一个实际的节点属性数组。在您当前的实现中,它不是一个数组,只是由空格分隔的属性。
这在模板上有点逻辑过载,但它应该可以工作。
示例模板:
<% p_list = %W( #{node['oracledb']['install']['oneoff']['db_oo_apply']} #{node['oracledb']['install']['oneoff']['db_psu_num']} )
<% p_list_fin = p_list.uniq.sort %>
patchlist=( <% p_list_fin.each do |p| %><% next if p.nil? %><%= p %> <% end %>)
当然p_list
,节点属性数组的创建可以在配方中完成,也可以传入variables
资源template
。
推荐阅读
- c# - 如何在鼠标悬停时更改 TabControl 关闭按钮图像?
- javascript - 如何在express node.js的get请求中将jwt令牌发送到中间件
- javascript - 在使用 JavaScript 的 HTML 的结果中获得了 `function () { [native code] }` 值
- python - 计算正弦定律的问题
- javascript - 导入反应不起作用
- python - 循环遍历python数组,将特定值设置为指定列
- javascript - React Lottie 不显示动画不显示(网络)
- oracle - 多个块中的必填字段
- oracle - SQL*Plus:在运行时提供绑定变量的值,如在 Toad/SQL-Developer 中
- firebase - 如何在firebase云功能中实现授权