Chefのattributesでnode searchする

世の中には脱Chefをしたブログもあれば、根強く使い続ける僕もいます。確かにk8s前提のところは僕らもChef使ってないから、そうなるよな・・・と思って読んでいました。

さて、話は変わって、Alertmanagerのクラスタリングするにあたって、attributesでnode searchやりたかったのでこういうのやった。

class AttributeSearch
  extend Chef::DSL::DataQuery
end

monitor_nodes = AttributeSearch.search(:node, "chef_environment:#{node.chef_environment} AND name:monitor*")
if !monitor_nodes.empty? && node.chef_environment != 'test'
  default['prometheus']['alertmanager']['peer'] = monitor_nodes.map { |m|
    m[:ipaddress]
  }.find { |m|
    m != node[:ipaddress]
  }
end

これよくChefでクラスタ組むときにやるテクニックで、自分と同じロールの自分以外のIPを動的に取るっていう感じ。上手に使うと色々Rubyっぽくかけて便利。