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

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

Это было легко CFEngine... но я в Кукольная среда сейчас, и нужно иметь возможность назначать / гарантировать / проверять определенные переменные 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, предложенной Джеффом Ферландом и из Марионетка вики.

Я создал 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";
  }
}

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


Общий ответ и руководство: В Авгий построить (см. также его справочная документация по типу), который является частью текущих версий 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, аналогичная той, что вы разместили в своем вопросе, так что это также может пролить свет.

Я использовал этот модуль раньше с RHEL5: марионетка-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 данные или настраиваемые параметры, а модули остаются универсальными, подключаемыми и «модульными».

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

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

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

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