Puppet - как использовать другой источник файлов - PullRequest
0 голосов
/ 04 декабря 2018

Я создал конфигурацию в агенте Puppet for 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 Ответ

0 голосов
/ 06 декабря 2018

Проблема с тем, что у вас есть, заключается в том, что вы используете require, который только гарантирует, что указанный ресурс (в данном случае каждый exec) выполняется перед ресурсом file.Требуемое поведение больше соответствует отношениям notify (которые создают событие обновления), однако ресурсы file не заботятся о событиях обновления.Вы можете прочитать больше об обновлении отношений здесь: https://puppet.com/docs/puppet/latest/lang_relationships.html#refreshing-and-notification.

Есть два возможных способа исправить это.Первым из них будет использование оператора 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 во время компиляции), что означает, что вы можете использовать функцию, чтобы проверить, существует ли файл.У меня не было возможности попробовать эту функцию, но вы можете просмотреть документацию здесь: https://puppet.com/docs/puppet/6.0/integrating_secrets_and_retrieving_agent-side_data.html.

...