On 11/15/17 1:03 PM, [email protected] wrote:
> 
> Any ideas for debugging this?
> 
> On Friday, November 10, 2017 at 5:06:40 PM UTC-5, [email protected] wrote:
> 
>     Hi,
> 
>     I've got a custom fact called is_internal that produces a Boolean value:
> 
>     # puppet apply -e 'notice(type($is_internal))'
>     Notice: Scope(Class[main]): Boolean
> 
>     I'm using it in my puppet.conf template like this:
> 
>     server=<%if @is_internal == true -%>puppetmaster-internal<% else
>     -%>puppetmaster<% end -%>
> 
>     The fact is relatively simple, it checks to see if any interface
>     matches the regexp 10.0.1, and if so, it sets is_internal to true
>     (I'm including the fact below).
> 
>     Strangely, two machines with the same node definition are producing
>     different results. On machine A if I run puppet, is_internal is
>     evaluated to be false, and the template is set to have
>     'puppetmaster-internal', but on machine B it somehow evaluates to be
>     'true' and sets the value to the non-internal one in the template.
> 
>     As you can see from the interfaces configuration, neither machine
>     has 10.0.1.x configured for their interface (they use 10.0.2.x), see
>     below for the output of 'ip addr ls'.
> 
>     Both machines respond with 'false' when I do `facter -p
>     is_internal`, yet, when Machine B has puppet run, for some reason it
>     is evaluated to be true via puppet:
> 
>     Machine A:
>     # facter -p is_internal
>     false
>     # puppet apply -e 'notice($is_internal)'
>     Notice: Scope(Class[main]): false
> 
>     Machine B:
>     # facter -p is_internal
>     false
>     # puppet apply -e 'notice($is_internal)'
>     Notice: Scope(Class[main]): true
> 
>     Both run 4.8.2 puppet version and facter 2.4.6. What could possibly
>     make Machine B change this value when it is run through puppet?!
> 
>     Thanks for any ideas, I'm going absolutely insane with this.
> 
>     Machine A:
> 
>     1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
>     group default
>         link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
>         inet 127.0.0.1/8 <http://127.0.0.1/8> scope host lo
>            valid_lft forever preferred_lft forever
>         inet6 ::1/128 scope host
>            valid_lft forever preferred_lft forever
>     2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
>     master br-public state UP group default qlen 1000
>         link/ether 00:30:48:7c:d7:78 brd ff:ff:ff:ff:ff:ff
>     3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
>     master br-private state UP group default qlen 1000
>         link/ether 00:30:48:7c:d7:79 brd ff:ff:ff:ff:ff:ff
>     5: br-private: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc
>     noqueue state UP group default
>         link/ether 00:30:48:7c:d7:79 brd ff:ff:ff:ff:ff:ff
>         inet 10.0.2.11/24 <http://10.0.2.11/24> brd 10.0.2.255 scope
>     global br-private
>            valid_lft forever preferred_lft forever
>         inet6 fe80::230:48ff:fe7c:d779/64 scope link
>            valid_lft forever preferred_lft forever
>     6: tap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
>     master br-public state UNKNOWN group default qlen 500
>         link/ether fe:0a:cf:dd:a8:b2 brd ff:ff:ff:ff:ff:ff
>         inet6 fe80::fc0a:cfff:fedd:a8b2/64 scope link
>            valid_lft forever preferred_lft forever
>     10: tap1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc
>     pfifo_fast master br-public state UNKNOWN group default qlen 500
>         link/ether fe:1e:ec:4c:ac:6c brd ff:ff:ff:ff:ff:ff
>         inet6 fe80::fc1e:ecff:fe4c:ac6c/64 scope link
>            valid_lft forever preferred_lft forever
> 
> 
>     Machine B:
> 
>     root@mesange-pn:/var/lib/puppet/lib/facter# ip a ls
>     1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
>     group default
>         link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
>         inet 127.0.0.1/8 <http://127.0.0.1/8> scope host lo
>            valid_lft forever preferred_lft forever
>         inet6 ::1/128 scope host
>            valid_lft forever preferred_lft forever
>     2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
>     master br-public state UP group default qlen 1000
>         link/ether 00:30:48:7e:52:18 brd ff:ff:ff:ff:ff:ff
>     3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
>     master br-private state UP group default qlen 1000
>         link/ether 00:30:48:7e:52:19 brd ff:ff:ff:ff:ff:ff
>     5: br-private: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc
>     noqueue state UP group default
>         link/ether 00:30:48:7e:52:19 brd ff:ff:ff:ff:ff:ff
>         inet 10.0.2.10/24 <http://10.0.2.10/24> brd 10.0.2.255 scope
>     global br-private
>            valid_lft forever preferred_lft forever
>         inet 10.0.2.1/32 <http://10.0.2.1/32> scope global br-private:0
>            valid_lft forever preferred_lft forever
>         inet6 fe80::230:48ff:fe7e:5219/64 scope link
>            valid_lft forever preferred_lft forever
>     9: tap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
>     master br-public state UNKNOWN group default qlen 500
>         link/ether fe:2d:b0:c6:2b:58 brd ff:ff:ff:ff:ff:ff
>         inet6 fe80::fc2d:b0ff:fec6:2b58/64 scope link
>            valid_lft forever preferred_lft forever
>     10: tap1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc
>     pfifo_fast master br-public state UNKNOWN group default qlen 500
>         link/ether fe:69:06:4b:83:19 brd ff:ff:ff:ff:ff:ff
>         inet6 fe80::fc69:6ff:fe4b:8319/64 scope link
>            valid_lft forever preferred_lft forever
> 
>     require 'facter/util/ip'
>      
>     def has_address(interface)
>       ip = Facter::Util::IP.get_interface_value(interface, 'ipaddress')
>       if ip.nil?
>         false
>       else
>         true
>       end
>     end
>      
>     def is_internal(interface)
>       rfc1918 = Regexp.new('^10\.0\.1\.')
>       ip = Facter::Util::IP.get_interface_value(interface, 'ipaddress')
>       if rfc1918.match(ip)
>         true
>       else
>         false
>       end
>     end
>      
>     def find_networks
>       found_public = found_internal = false
>       Facter::Util::IP.get_interfaces.each do |interface|
>         if has_address(interface)
>           if is_internal(interface)
>             found_internal = true
>           else
>             found_public = true
>           end
>         end
>       end
>       [found_public, found_internal]
>     end
>      
>     # these facts check if any interface is on a public or internal network
>     # they return the string true or false
>     # this fact will always be present
> 
>     Facter.add(:is_internal) do
>       confine :kernel => Facter::Util::IP.supported_platforms
>       setcode do
>         found_public, found_internal = find_networks
>         found_internal
>       end
>     end
> 
>     Facter.add(:interfaces_internal) do
>       confine :kernel => Facter::Util::IP.supported_platforms
>       setcode do
>         iface=""
>         Facter::Util::IP.get_interfaces.each do |interface|
>           if has_address(interface)
>             if is_internal(interface)
>               iface += "," unless iface.empty?
>               iface = iface + Facter::Util::IP.alphafy(interface)
>             end
>           end
>         end
>         iface
>       end
>     end
> 
> -- 

Hi,

Suggest writing unit tests. The practice of writing them often exposes
issues with your implementation.

Here's a simple one that shows how you can define your expectations and
stub out commands.

https://github.com/ghoneycutt/puppet-module-ssh/blob/master/spec/unit/facter/ssh_spec.rb

BTW, you might want to think of another approach than relying on the
network as a source of truth. As your network grows and changes, you
will have tight coupling between what your systems do and the IP's they
have.

Best regards,
-g


-- 
Garrett Honeycutt
@learnpuppet
Puppet Training with LearnPuppet.com
Mobile: +1.206.414.8658

-- 
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/puppet-users/6efad7be-2860-d0c2-4cbc-c33203063716%40garretthoneycutt.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to