# frozen_string_literal: true require 'json' require 'open3' Facter.add(:k8s_masters) do confine do File.exist?('/etc/rancher/rke2/rke2.yaml') && File.executable?('/usr/bin/kubectl') end setcode do env = { 'KUBECONFIG' => '/etc/rancher/rke2/rke2.yaml' } cmd = ['/usr/bin/kubectl', 'get', 'nodes', '-o', 'json'] stdout, stderr, status = Open3.capture3(env, *cmd) if status.success? json = JSON.parse(stdout) master_count = json['items'].count do |item| roles = item.dig('metadata', 'labels') || {} # Look for well-known labels assigned to control-plane nodes roles.any? do |key, _| key =~ %r{node-role\.kubernetes\.io/(control-plane|master|etcd)} end end master_count else Facter.debug("kubectl error: #{stderr}") 0 end rescue StandardError => e Facter.debug("Exception in k8s_masters fact: #{e.message}") 0 end end