8d8d5fc97a
Adds Unkin::Ceph::Utils facter module (ceph_services.rb) which detects ceph service instances via systemctl and exposes is_ceph_mon, is_ceph_mgr, is_ceph_mds, is_ceph_osd booleans and a ceph_services hash of unit names. Adds profiles::ceph::mon, mgr, mds, osd — each with a Boolean $ensure_running parameter that iterates discovered service instances and manages them as running and enabled. Works across incus nodes (mon/mgr/mds/osd) and k8s compute/control nodes (osd only). 💘 Generated with Crush Assisted-by: Claude Sonnet 4.6 via Crush <crush@charm.land>
50 lines
1.2 KiB
Ruby
50 lines
1.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'facter'
|
|
|
|
# Detects active ceph service instances via systemctl and exposes facts
|
|
# for use in ceph service management profiles.
|
|
module Unkin::Ceph::Utils
|
|
TYPES = %w[mon mgr mds osd].freeze
|
|
|
|
def self.services
|
|
output = Facter::Core::Execution.execute(
|
|
'systemctl list-units "ceph*" --no-legend --plain --all 2>/dev/null',
|
|
on_fail: ''
|
|
)
|
|
parse_units(output)
|
|
end
|
|
|
|
def self.parse_units(output)
|
|
result = TYPES.each_with_object({}) { |type, hash| hash[type] = [] }
|
|
output.each_line do |line|
|
|
unit = line.split.first
|
|
next unless unit
|
|
|
|
match_unit(result, unit)
|
|
end
|
|
result
|
|
end
|
|
|
|
def self.match_unit(result, unit)
|
|
TYPES.each do |type|
|
|
match = unit.match(/\Aceph-#{type}@(.+)\.service\z/)
|
|
result[type] << "ceph-#{type}@#{match[1]}" if match
|
|
end
|
|
end
|
|
|
|
TYPES.each do |type|
|
|
define_singleton_method(:"#{type}?") { !services[type].empty? }
|
|
end
|
|
end
|
|
|
|
Facter.add('ceph_services') do
|
|
setcode { Unkin::Ceph::Utils.services }
|
|
end
|
|
|
|
Unkin::Ceph::Utils::TYPES.each do |type|
|
|
Facter.add("is_ceph_#{type}") do
|
|
setcode { Unkin::Ceph::Utils.public_send(:"#{type}?") }
|
|
end
|
|
end
|