Defined Type: monitoring::host

Defined in:
modules/monitoring/manifests/host.pp

Overview

Define monitoring::host

Exports the resource that monitors hosts in icinga

Parameters:

  • ensure (Wmflib::Ensure) (defaults to: present)
  • os (String) (defaults to: $facts['operatingsystem'])
  • critical (Boolean) (defaults to: false)
  • ip_address (Stdlib::Host) (defaults to: $facts['ipaddress'])
  • host_fqdn (Optional[Stdlib::Fqdn]) (defaults to: undef)
  • contact_group (Optional[String]) (defaults to: undef)
  • group (Optional[String]) (defaults to: undef)
  • parents (Optional[String]) (defaults to: undef)
  • notifications_enabled (Optional[Boolean]) (defaults to: undef)


4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'modules/monitoring/manifests/host.pp', line 4

define monitoring::host (
    Wmflib::Ensure         $ensure                = present,
    String                 $os                    = $facts['operatingsystem'],
    Boolean                $critical              = false,
    Stdlib::Host           $ip_address            = $facts['ipaddress'],
    Optional[Stdlib::Fqdn] $host_fqdn             = undef,
    Optional[String]       $contact_group         = undef,
    Optional[String]       $group                 = undef,
    Optional[String]       $parents               = undef,
    Optional[Boolean]      $notifications_enabled = undef,
){

    include monitoring
    $_contact_group          = pick($contact_group, $monitoring::contact_group)
    # Use pick default as it allows an undef default
    $_notifications_enabled = pick($notifications_enabled, $monitoring::notifications_enabled)
    $hostgroup              = pick($group, $monitoring::nagios_group)
    $nagios_address         = pick($host_fqdn, $ip_address)

    $real_contact_groups = $critical ? {
        # TODO: we should probably move this to the profile
        true    => "${_contact_group},sms,admins",
        default => $_contact_group,
    }

    # Define the nagios host instance
    # The following if guard is there to ensure we only try to set per host
    # attributes in the case the host exports it's configuration. Since this
    # definition is also used for non-exported resources as well, this if guard
    # is required
    if $title == $facts['hostname'] {
        $image = $os ? {
            'Junos'   => 'juniper',
            default   => 'debian'
        }
        $icon_image      = "vendors/${image}.png"
        $vrml_image      = "vendors/${image}.png"
        $statusmap_image = "vendors/${image}.gd2"
        # Allow overriding the parents of a device. This makes the exposed API
        # more consistent, even though it's doubtful we will ever use this
        # functionality in the case of an exported host
        if $parents {
            $real_parents = $parents
        } elsif ($facts['is_virtual'] == false) and $facts['lldp'] {
            # Only set the (automatic) parent for physical hosts. We want to
            # still alert for each individual VM when the hosts die, as:
            # a) just a host DOWN alert for the VM node is too inconspicuous,
            # b) it's usually the case that VMs can be relocated to other nodes
            #
            # Old Juniper switches advertise their short name, while new ones advertise their FQDN
            $real_parents = $facts['lldp']['parent'].split('\.')[0]
        } else {
            $real_parents = undef
        }

        # Populate a network related hostgroup for directly connected to switches
        # hosts
        if $facts['lldp'] and $facts['lldp']['parent'] =~ /asw|cloudsw|lsw/ {
            $hostgroups = "${hostgroup},${facts['lldp']['parent'].split('\.')[0]}"
        } else {
            $hostgroups = $hostgroup
        }
    } else {  # Network devices are defined in this section
        if $os == 'Junos' {
            $icon_image      = 'vendors/juniper.png'
            $vrml_image      = 'vendors/juniper.png'
            $statusmap_image = 'vendors/juniper.gd2'
        } else {
            $icon_image      = undef
            $vrml_image      = undef
            $statusmap_image = undef
        }
        $real_parents    = $parents
        $hostgroups = $hostgroup
    }
    $host = {
        "${title}" => {
            ensure                => $ensure,
            host_name             => $title,
            parents               => $real_parents,
            address               => $nagios_address,
            hostgroups            => $hostgroups,
            check_command         => 'check_ping!500,20%!2000,100%',
            check_period          => '24x7',
            max_check_attempts    => 2,
            notifications_enabled => $_notifications_enabled.bool2str('1', '0'),
            contact_groups        => $real_contact_groups,
            notification_interval => 0,
            notification_period   => '24x7',
            notification_options  => 'd,u,r,f',
            icon_image            => $icon_image,
            vrml_image            => $vrml_image,
            statusmap_image       => $statusmap_image,
        },
    }
    # This is a hack. We detect if we are running on the scope of an icinga
    # host and avoid exporting the resource if yes
    if defined(Class['icinga']) {
        $rtype = 'nagios_host'
    } else {
        $rtype = 'monitoring::exported_nagios_host'
    }
    create_resources($rtype, $host)
}