Chef infra 如何对Chef搜索中的节点进行排序?

Chef infra 如何对Chef搜索中的节点进行排序?,chef-infra,chef-recipe,Chef Infra,Chef Recipe,我有一个从chef搜索返回的节点列表,用于创建配置文件。需要对这些节点进行排序,因为 配置文件所针对的软件需要这些节点处于有序状态 Chef并不总是以相同的顺序返回节点,因此即使配置保持不变,每次运行Chef时都会重写文件 要创建按属性排序的节点列表,可以执行如下操作,即按域名对节点进行排序: nodes = search(:node, "fqdn:*") nodes.sort_by!{ |n| n[:fqdn] } 要仅返回这些属性的列表,可以使用以下扩展: nodes.map!{ |n|

我有一个从chef搜索返回的节点列表,用于创建配置文件。需要对这些节点进行排序,因为

  • 配置文件所针对的软件需要这些节点处于有序状态
  • Chef并不总是以相同的顺序返回节点,因此即使配置保持不变,每次运行Chef时都会重写文件

  • 要创建按属性排序的节点列表,可以执行如下操作,即按域名对节点进行排序:

    nodes = search(:node, "fqdn:*")
    nodes.sort_by!{ |n| n[:fqdn] }
    
    要仅返回这些属性的列表,可以使用以下扩展:

    nodes.map!{ |n| n[:fqdn] }
    
    在较新版本的Chef上,
    :filter\u result
    只能用于获取将使用的节点属性:

    nodes = search(:node, "fqdn:*", filter_result: { fqdn: [:fqdn] })
    nodes.map! { |node| node[:fqdn] }
    nodes.sort!
    

    #2是一种非常常见的Chef反模式,可能会导致大量不必要的服务启动。使用filter_result会比nodes.map更好,因为它可以节省带宽。