Regex detection for Puppet configuration
You're working too hard, trying to distinguish strings from regular expressions.  Rather, you should take advantage of the fact that the === operator for a RegExp and the === operator for a String both express the idea of a "match", which is what you want here.

I don't understand why you need to #intern all the strings.

I don't see why the fval = Facter.value(fact).to_s assignment appears inside an if condition.  The result of the assignment would only be false if Facter.value(fact).to_s is false or nil, which can never happen.  (Even nil.to_s results in an empty string.)

To treat values as an array regardless of whether a scalar or an array was passed in, you can use the [*values] idiom.

def self.fact_match(fact, values)
  fact_val = Facter.value(fact).to_s.downcase
  fact_val != "" and [*values].any? { |v| v === fact_val }
end


In addition to supporting literal case-insensitive matches and regular expression matches, also consider supporting Ranges.