Установите параметры sysctl.conf с помощью Puppet


10

Это был бриз в CFEngine ... Но сейчас я нахожусь в среде Puppet , и мне нужно иметь возможность назначать / проверять / проверять определенные переменные sysctl.conf. В мире CFEngine я мог бы просто проверить наличие определенных строк в файле конфигурации ... Я нашел небольшую ссылку на модуль sysctl в вики Puppet и проект в github, который, кажется, выполняет то, что я хочу.

Но ни один из них не документирован. Я просто ищу способ отредактировать пару значений, таких как net.core.rmem_defaultи net.core.wmem_max. В формате проекта, размещенного на github , конфиг в моем манифесте init.pp должен выглядеть следующим образом:

class sysctl {

sysctl::value {
        "net.core.rmem_default": value => "9000000";
        "net.core.wmem_default": value => "9000000";
        "net.core.rmem_max": value => "16777216";
        "net.core.wmem_max": value => "16777216";
        }
}

Просматривая форумы и списки рассылки, кажется, что существует разница в разнице между подключаемыми модулями и модулями Puppet. Термины почти взаимозаменяемы ... В конечном итоге мне понадобилось включить функцию pluginsync на моих клиентах, чтобы избежать некоторых ошибок. Я думал, что это был модуль!

Текущие ошибки клиента:

info: Loading downloaded plugin /var/lib/puppet/lib/puppet/type/sysctl.rb
info: Loading downloaded plugin /var/lib/puppet/lib/puppet/provider/sysctl/parsed.rb
err: Could not retrieve catalog from remote server: Error 400 on SERVER: Puppet::Parser::AST::Resource failed with error 
ArgumentError: Invalid resource type sysctl::value at /var/lib/puppet/base/modules/sysctl/manifests/init.pp:12 on node shimano.deore.abc.net
    warning: Not using cache on failed catalog
    err: Could not retrieve catalog; skipping run

Любые мысли о том, как сделать это с наименьшим количеством боли?

Редактировать: Я затронут этой ошибкой ?

Редактировать: Исправлено использование библиотеки Augeas в соответствии с предложением Джеффа Ферланда и из вики Puppet .

Я создал sysctlмодуль ...

class sysctl {

  # nested class/define
  define conf ( $value ) {

    # $name is provided by define invocation

    # guid of this entry
    $key = $name

    $context = "/files/etc/sysctl.conf"

     augeas { "sysctl_conf/$key":
       context => "$context",
       onlyif  => "get $key != '$value'",
       changes => "set $key '$value'",
       notify  => Exec["sysctl"],
     }

  }

   file { "sysctl_conf":
      name => $operatingsystem ? {
        default => "/etc/sysctl.conf",
      },
   }

   exec { "/sbin/sysctl -p":
      alias => "sysctl",
      refreshonly => true,
      subscribe => File["sysctl_conf"],
   }

}

... и другой модуль для установки соответствующих настроек ...

class prod_sysctl {

include sysctl

sysctl::conf {

  # increase PID rollover value
  "kernel.pid_max": value =>  "1048576";
  }
}

Это отлично. Рассматривали ли вы написание этого как модуль, который публикуется на кукольном кузнице?
TomOnTime

Ответы:


14

Конкретный ответ: Сразу же вы вызываете sysctl :: value, но значение не объявлено в вашем классе sysctl. Посмотрите этот пример, который использует объявление sysctl :: conf. Без этого define valueнет подкласса sysctl :: value для вызова.


Общий ответ и руководство. Конструкция Augeas (см. Также справочную документацию по типам ), которая является частью текущих версий Puppet, позволяет поддерживать строки в файле конфигурации и даже учитывать контекст, поэтому она может управлять файлами, такими как конфигурация git. Приведенный ниже пример демонстрирует функциональность и указывает на большой справочный набор конфигов Puppet - хранилище конфигурации для серверов Википедии.

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = https://gerrit.wikimedia.org/r/p/operations/puppet
[branch "production"]
    remote = origin
    merge = refs/heads/production

Один простой пример из приведенной выше документации конфигурации:

augeas { "sshd_config":
 context => "/files/etc/ssh/sshd_config",
  changes => [
    "set PermitRootLogin no",
  ],
}

Итак, если вы хотите управлять своим /etc/sysctl.conf, введите следующее:

augeas { "sysctl":
 context => "/files/etc/sysctl.conf",
  changes => [
    "set kernel.sysrq = 0",
    #and whatever other lines are interesting to you
  ],
}

Пример Авгий также имеет конструкцию для класса SYSCTL на основе Augeus , который похож на то , что вы вывесили в вашем вопросе, так что может также пролить некоторый свет.


Определение в value.ppманифесте распространяется вместе с module-sysctlмодулем. Похожеdefine sysctl::value ( $key = 'name', $value ) {
ewwhite

@ewwhite Похоже, ошибка, с которой вы связаны, может относиться к вашей ситуации. Можете ли вы подтвердить, что модуль загружается на вашей целевой машине?
Джефф Ферланд

Как я могу проверить наличие модуля?
ewwhite

Собираюсь с подходом Augeas. Я думаю, что я столкнулся с ошибкой с другим решением.
ewwhite

2

Я использовал этот модуль в прошлом с RHEL5: puppet-sysctl

Чтобы использовать его, вам нужно установить модуль в папку ваших модулей (возможно, / etc / puppet / modules / sysctl), включить класс на вашем узле: (include sysctl), а затем вызвать ресурс def следующим образом:

class s_sysctl::rhel_defaults {
    include sysctl

    # Controls IP packet forwarding
    sysctl::set_value { "net.ipv4.ip_forward": 
                         value => 0 
    }

    # Controls source route verification
    sysctl::set_value { "net.ipv4.conf.default.rp_filter": value => 1 }
}

Так что вы можете быть удивлены, куда этот код на самом деле идет? Мне нравится организовывать свое кукольное дерево так:

site.pp -> nodes.pp -> roles.pp -> /etc/puppet/site-modules/s_sysctl -> /etc/puppet/modules/sysctl

Таким образом, модули сайта содержат данные hiera или настраиваемые модули, а модули остаются общими, подключаемыми и «модульными».


Да, это связано в моем вопросе. Там нет документации для модуля, и я не уверен, где его установить или как на самом деле его использовать.
ewwhite

Извините, я не прочитал весь ваш вопрос :) Модуль содержит определение, которое необходимо вызвать в другом классе. Я отредактирую свой ответ и
включу

Так с этим, ошибки , которые я получаю , являются:err: Could not retrieve catalog from remote server: Error 400 on SERVER: Puppet::Parser::AST::Resource failed with error ArgumentError: Invalid resource type sysctl::value at /var/lib/puppet/base/modules/sysctl/manifests/init.pp:12 on node shimano.deore.abc.net
ewwhite

Похоже, вы вызываете определение с меткой 'sysctl :: value', а не 'sysctl :: set_value'.
Робби

Определение в value.ppманифесте распространяется вместе с module-sysctlмодулем. Похожеdefine sysctl::value ( $key = 'name', $value ) {
ewwhite

0

До тех пор, пока вам не нужно менять значение (или вы удовлетворены добавлением строк с новыми значениями), вы можете использовать Common line . Вы можете использовать пару present/ absentконфигурации при изменении значения.

Чтобы изменить значение - при условии, что строка уже существует - вы можете использовать replaceв том же модуле.

Или вы можете посмотреть, как написаны эти определения, чтобы сделать их подходящими для вашей задачи - что, на ваш взгляд, я считаю достаточно простым и достаточно распространенным, чтобы его должны были предоставить типы Puppet по умолчанию.

Так почему бы и нет? Потому что Puppet ожидает, что вы полностью управляете тем, чем управляете. То есть вы должны распространять весь файл sysctl вместо простого добавления или удаления того или иного значения. Я не говорю, что это легко сделать, но если вам это сойдет с рук, то это самый простой способ сделать это.


Я не думаю, что управление всем файлом является масштабируемым. Я знал, что весь вариант файла был возможен, но используйте случай небольших изменений в выпуске RHEL ... Могут быть sysctl.confзначения по умолчанию, которые изменяются между версиями RHEL. Мы можем не захотеть игнорировать / перезаписывать их, вместо того, чтобы гарантировать, что определенный параметр может быть установлен / изменен.
ewwhite

@ewwhite Разве у RHEL нет локального файла переопределения sysctl.conf? Или вы имеете в виду вы имеете различные конфигурации в зависимости от версии? В последнем случае вы можете создать шаблон и выбрать строки в зависимости от версии ОС.
Даниэль С. Собрал
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.