# frozen_string_literal: true require 'ipaddr' # a class that creates facts based on the subnet class SubnetAttributes SUBNET_TO_ATTRIBUTES = { '198.18.13.0/24' => { environment: 'prod', region: 'syd1', country: 'au', zone: 'common' }, '198.18.14.0/24' => { environment: 'prod', region: 'syd1', country: 'au', zone: 'common' }, '198.18.15.0/24' => { environment: 'prod', region: 'syd1', country: 'au', zone: 'common' }, '198.18.16.0/24' => { environment: 'test', region: 'syd1', country: 'au', zone: 'common' }, '198.18.17.0/24' => { environment: 'prod', region: 'drw1', country: 'au', zone: 'common' }, '198.18.18.0/24' => { environment: 'test', region: 'drw1', country: 'au', zone: 'common' }, '198.18.19.0/24' => { environment: 'prod', region: 'syd1', country: 'au', zone: 'common' }, # loopbacks '198.18.20.0/24' => { environment: 'prod', region: 'syd1', country: 'au', zone: 'common' }, # MPLS CORE BLOCKS '198.18.21.0/24' => { environment: 'prod', region: 'syd1', country: 'au', zone: 'common' }, # physical network 2.5gbe '198.18.22.0/24' => { environment: 'prod', region: 'syd1', country: 'au', zone: 'common' }, # ceph cluster '198.18.23.0/24' => { environment: 'prod', region: 'syd1', country: 'au', zone: 'common' }, # ceph public '198.18.24.0/24' => { environment: 'prod', region: 'syd1', country: 'au', zone: 'dmz' }, # dmz 1 '198.18.25.0/24' => { environment: 'prod', region: 'syd1', country: 'au', zone: 'common' }, # common node0009 '198.18.26.0/24' => { environment: 'prod', region: 'syd1', country: 'au', zone: 'common' }, # common node0010 '198.18.27.0/24' => { environment: 'prod', region: 'syd1', country: 'au', zone: 'common' }, # common node0011 '198.18.28.0/24' => { environment: 'prod', region: 'syd1', country: 'au', zone: 'common' }, # common node0012 '198.18.29.0/24' => { environment: 'prod', region: 'syd1', country: 'au', zone: 'common' } # common node0013 }.freeze # Default attributes if no subnet matches, also defined as a constant DEFAULT_ATTRIBUTES = { environment: 'unknown', region: 'unknown', country: 'unknown' }.freeze # provide ip to return attributes def self.attributes(ip) SUBNET_TO_ATTRIBUTES.each do |subnet, attrs| return attrs if IPAddr.new(subnet).include?(IPAddr.new(ip)) end DEFAULT_ATTRIBUTES end end # Use the primary IP address from facts ip = Facter.value(:networking)['ip'] # Call the class method directly without creating an instance subnet_attributes = SubnetAttributes.attributes(ip) # Add separate facts for environment, region, and country Facter.add('environment') { setcode { subnet_attributes[:environment] } } Facter.add('region') { setcode { subnet_attributes[:region] } } Facter.add('country') { setcode { subnet_attributes[:country] } } Facter.add('zone') { setcode { subnet_attributes[:zone] } }