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 [...] игнорируется.

My проверьте определение:

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. Как это сделать правильно?

0
задан 4 December 2018 в 11:25
2 ответа

Puppet работает не так. Вы не можете использовать ресурсы exec в качестве условной логики для других ресурсов, подобных этому. Ваш параметр require указывает только на то, что ресурсы exec должны обрабатываться до ресурсов файла , а не на то, что их «возвращаемое значение» должно указывать, создавать ли ресурс. или нет.

Если вы хотите указать, существуют ли эти каталоги или нет, вы должны создать один или несколько настраиваемых фактов, которые проверяют наличие этих каталогов. Одного факта $ nagios_plugin_dir , вероятно, будет достаточно, чтобы просто вернуть первый каталог из трех, существующих на хосте, а затем просто использовать его в пути к ресурсам вашего файла :

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

1
ответ дан 4 December 2019 в 13:23

Бодгит верен в том, что это лучше всего обрабатывается шаблоном, который проверяет операционную систему, в которой вы находитесь, и делает это таким образом, или пользовательский факт.

НО теперь можно запускать функции, которые проверяют вещи на стороне агента! В последней версии 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"],
    }
}  
1
ответ дан 4 December 2019 в 13:23

Теги

Похожие вопросы