Назад | Перейти на главную страницу

Puppet - как использовать другой источник файла

Я создаю конфигурацию в 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. Как это сделать правильно?

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"],
    }
}  

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 в наши дни.