KubernetesでマニフェストのAPIバージョンをあげたい場合に利用するスクリプト

青山くんが教えてくれなかったので書きました。

require 'yaml'
kind = "ClusterRoleBinding".freeze
before = "rbac.authorization.k8s.io/v1beta1".freeze
after = "rbac.authorization.k8s.io/v1".freeze

Dir.glob("manifests/**/*").each do |f|
  next unless f =~ /yaml|yml/

  line_buff = []
  line_num = 0
  api_line = 0
  should_write = false
  File.foreach(f) do |line|
    line_num += 1
    api_line = line_num - 1 if line =~ /^apiVersion:\s+#{before}$/

    if line =~ /kind:\s*#{kind}$/ && api_line != 0
      line_buff[api_line] = "apiVersion: #{after}\n"
      should_write = true
    end
    api_line = 0 if line =~ /---/
    line_buff << line
  end

  IO.write(f, line_buff.join) if should_write

end

引数とってあれこれとかもいいんですけど、こういうの手元でパキパキ書き換えて実効するほうが好きなのでもし同じような事する人がいたらネタにしてくだしあというレベルのコードです。

いやー、絶対便利ツールあるよなぁとか思ったりもする。k8sのバージョンとマニフェストを引数に渡したらいい感じにvalidにしてくれるやつ。DaemonSetにselector必要になったりしたときただlabelsをコピペするだけ行とかやったもんなぁ。。