Puppet-如何使用不同的文件源

Puppet-如何使用不同的文件源

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

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

Puppet 的工作方式并非如此。您不能将exec资源用作其他资源的条件逻辑。您的require参数仅表示exec应在资源之前处理资源file,而不是其“返回值”应指示是否创建资源。

如果您想指示这些目录是否存在,您应该创建一个或多个自定义事实来检查这些目录是否存在。一个$nagios_plugin_dir事实可能就足够了,只需返回主机上存在的三个目录中的第一个目录,然后在资源路径中使用它即可file

file { "${nagios_plugin_dir}/check_linux_stats.pl":
  ensure  => file,
  owner   => root,
  group   => root,
  mode    => 755,
  content => template('nagios_client/check_linux_stats.pl.erb'),
}

然后你也可以这样做:

file { '/etc/nagios/nrpe.cfg':
  ensure  => file,
  owner   => root,
  group   => root,
  mode    => 644,
  content => template('nagios_client/nrpe-cfg.erb'),
}

并且在您的 ERB 模板中只需使用这个事实在相同的路径中进行模板化(我认为这就是您首先拥有三个不同模板的原因?)。

你也真的真的现在的 Puppet 版本已经很旧了。

答案2

bodgit 是正确的,因为最好通过一个模板来处理这个问题,该模板检查您所使用的操作系统并以此方式执行,或者通过自定义事实。

但是现在可以运行检查代理端的功能了!在最新版本的 Puppet (Puppet 6+) 中,函数可以推迟到代理上运行。因此,您可以使用 file_exists 函数,延迟运行它并在代码中引用该值:

module Puppet::Parser::Functions
    newfunction(:file_exists, :type => :rvalue) do |args|
        file = File.expand_path(args[0])
        if File.exists?(file)
            return true
        else
            return false
        end
    end
end

然后您可以在代码中使用它,如下所示:

$lib64nagiosexists = Deferred(“file_exists”, ["/usr/lib64/nagios/plugins”])

然后把你的代码放在那个标志后面

if $lib64nagiosexists {
    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"],
    }
}  

相关内容