On Wednesday, February 11, 2015 at 7:04:18 AM UTC-6, Robert Reilly wrote:
>
> All, I am getting the following problem with facter on 5 of my nodes,
> Fact resolution fact='enviro', resolution='<anonymous>' resolved to an 
> invalid value: Expected (?-mix:xxx(vs|sv).{2,7}\d{1,2}) to be one of 
> [Integer, Float, TrueClass, FalseClass, NilClass, String, Array, Hash], but 
> was Regexp, this seems to only happen to one application running on rhel 
> 5.8 puppet agent 3.5.1 facter 2.0.1
>
>

Do you have other machines running RHEL 5?  Is it possible that Facter on 
this machine is running under the distribution's Ruby (which is version 
1.8.5, no longer supported by Puppet)?

 

> here is my fact
>
> Facter.add(:enviro) do
>     setcode do
>       hostname = Facter.value('hostname')
>         if ( hostname =~  /^.{5}d{1}/i )
>            enviro="dev"
>            enviro
>         elsif (hostname =~  /^.{5}q{1}/i )
>           enviro="qa"
>           enviro
>         elsif (hostname =~  /^.{4,5}u{1}/i )
>           enviro="uat"
>           enviro
>         elsif (hostname =~  /^.{5}p{1}/i )
>           enviro="prod"
>           enviro
>         elsif (hostname =~  /^.{5}xxx/i )
>           enviro="prod"
>           enviro
>         else
>           enviro="unclassified"
>           enviro
>         end
>     end
> end
> ~                           
>


That's a slightly odd way to write it, but it looks like it should work.  
Note that it is pointless for your blocks to end with "enviro" as a 
standalone statement when the statement immediately preceding is an 
assignment to that variable.  The combination has exactly the same 
semantics as the assignment alone. Also, it is always pointless to use a 
'{1}' quantifier in a regex, as it has the same effect as no quantifier at 
all.

Though I don't see a reason why your fact code should fail, I would 
probably use much simpler code for the job, myself.  Perhaps something like 
this:

Facter.add(:enviro) do
    setcode do
       case Facter.value('hostname')
       when /^.{5}d/i
          'dev'
       when /^.{5}q/i
          'qa'
       when /^.{4,5}u/i
          'uat'
       when /^.{5}p/i
          'prod'
       when /^.{5}xxx/i
          'prod'
       else
          'unclassified'
       end
   end
end

Not only is it easier to read, there is much less room for any question 
about its semantics.  There is exactly one (compound) statement at the top 
level of the setcode block, so its value determines the fact value.  There 
are no variable assignments, so it is clear that no value can be carried 
forward from an earlier part of the code to a later part.  Even someone 
with little Ruby experience would have a good chance of understanding what 
it's doing if told that the setcode block produces a value.


John

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to puppet-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/puppet-users/d3da2294-2cba-4265-819e-ab73b5ad2123%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to