木偶-如何使用不同的文件源

时间:2018-12-04 08:13:15

标签: puppet nagios

我在Puppet中为Nagios代理(NRPE)创建了一个配置。现在,我试图根据Dirs的存在设置不同的文件源。首先,我检查特定目录是否存在,然后设置特定文件内容。我当前的配置文件如下:

class nagios_client::file_nagios-check-Linux-stats {

        include nagios_client::check_location_lib-nagios

        file { '/usr/lib/nagios/plugins/check_linux_stats.pl':
        ensure  => file,
        owner   => root,
        group   => root,
        mode    => 755,
        content => template("nagios_client/check_linux_stats.pl.erb"),
        require => Exec["check_usr-lib_exists"],
        }
        file { '/usr/lib64/nagios/plugins/check_linux_stats.pl':
        ensure  => file,
        owner   => root,
        group   => root,
        mode    => 755,
        content => template("nagios_client/check_linux_stats.pl.erb"),
        require => Exec["check_usr-lib64_exists"],
        }
        file { '/usr/lib32/nagios/plugins/check_linux_stats.pl':
        ensure  => file,
        owner   => root,
        group   => root,
        mode    => 755,
        content => template("nagios_client/check_linux_stats.pl.erb"),
        require => Exec["check_usr-lib32_exists"],
        }
    }

这很好,但是我对此有疑问:

class nagios_client::file_nrpe-cfg {

    #    include nagios_client::check_location_lib-nagios

        file { '/etc/nagios/nrpe.cfg.def':
            path    => '/etc/nagios/nrpe.cfg',
            ensure  => file,
            owner   => root,
            group   => root,
            mode    => 644,
            content => template("nagios_client/nrpe-cfg.erb"),
            require => Exec["check_usr-lib_exists"],
        }

        file { '/etc/nagios/nrpe.cfg.32':
            path    => '/etc/nagios/nrpe.cfg',
            ensure  => file,
            owner   => root,
            group   => root,
            mode    => 644,
            content => template("nagios_client/nrpe-cfg-32.erb"),
            require => Exec["check_usr-lib32_exists"],
        }

        file { '/etc/nagios/nrpe.cfg.64':
            path    => '/etc/nagios/nrpe.cfg',
            ensure  => file,
            owner   => root,
            group   => root,
            mode    => 644,
            content => template("nagios_client/nrpe-cfg-64.erb"),
            require => Exec["check_usr-lib64_exists"],
        }
    }

似乎require => Exec[...]被忽略了。

我的支票定义:

class nagios_client::check_location_lib-nagios {

    exec { 'check_usr-lib_exists':
    command => '/bin/true',
        onlyif  => '/usr/bin/test -d /usr/lib/nagios/plugins',
    }
    exec { 'check_usr-lib32_exists':
        command => '/bin/true',
        onlyif  => '/usr/bin/test -d /usr/lib32/nagios/plugins',
        }
    exec { 'check_usr-lib64_exists':
        command => '/bin/true',
        onlyif  => '/usr/bin/test -d /usr/lib64/nagios/plugins',
    }
}

我正在使用Puppet 3.8.7。如何以正确的方式做到这一点?

1 个答案:

答案 0 :(得分:0)

您所拥有的问题是您正在使用require,这只能确保指定的资源(在这种情况下,每个exec)在file资源之前执行。您想要的行为与notify关系(创建刷新事件)更紧密地对应,但是,file资源并不关心刷新事件。您可以在这里了解有关刷新关系的更多信息:https://puppet.com/docs/puppet/latest/lang_relationships.html#refreshing-and-notification

我可以通过2种可能的方式解决此问题。第一个方法是使用exec语句来管理文件,而不是file资源。这绝对不是最佳选择,因为您会丢失file资源中的所有参数(我当然不建议您使用这种方法,但是您可以这样做)。

另一种方法是创建一个自定义的ruby事实,以检查文件是否存在。事实看起来像这样:

Facter.add('nagios_directories') do
  confine kernel: 'Linux'

  setcode do
    paths_to_check = [
      '/usr/lib/nagios/plugins',
      '/usr/lib32/nagios/plugins',
      '/usr/lib64/nagios/plugins',
    ]
    paths_to_check.select { |d| File.directory?(d) }
  end
end

此事实将检查paths_to_check数组中列出的所有目录,并返回包含确实存在的目录的数组。如果没有目录,它将返回一个空数组。

设置好事实后,就可以这样重写代码:

class nagios_client::file_nrpe-cfg {
  if (member($fact['nagios_directories'], '/usr/lib/nagios/plugins')) {
    file { '/etc/nagios/nrpe.cfg.def':
              path    => '/etc/nagios/nrpe.cfg',
              ensure  => file,
              owner   => root,
              group   => root,
              mode    => 644,
              content => template("nagios_client/nrpe-cfg.erb"),
    }
  }

  if (member($fact['nagios_directories'], '/usr/lib32/nagios/plugins')) {
    file { '/etc/nagios/nrpe.cfg.32':
              path    => '/etc/nagios/nrpe.cfg',
              ensure  => file,
              owner   => root,
              group   => root,
              mode    => 644,
              content => template("nagios_client/nrpe-cfg-32.erb"),
    }
  }

  if (member($fact['nagios_directories'], '/usr/lib64/nagios/plugins')) {
    file { '/etc/nagios/nrpe.cfg.64':
      path    => '/etc/nagios/nrpe.cfg',
      ensure  => file,
      owner   => root,
      group   => root,
      mode    => 644,
      content => template("nagios_client/nrpe-cfg-64.erb"),
    }
  }
}

以下是一些有关自定义事实的其他文档:https://puppet.com/docs/facter/3.9/fact_overview.html

最后,如果您正在使用Puppet 6(当前是最新版本),则可以编写自定义Ruby函数并使用新的deferred类型。此类型使您可以在目录运行时在代理上执行功能(在此发行版之前,所有Puppet函数均在编译时在Puppet Master上执行),这意味着您可以使用函数来检查文件是否存在。我没有机会尝试使用此功能,但是您可以在此处查看文档:{​​{3}}。

相关问题