Встановіть параметри sysctl.conf за допомогою Лялечки


10

Це був вітер у 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";
        }
}

Переглядаючи форуми та списки розсилки, схоже, виникає плутанина в різниці між ляльковими модулями та модулями. Терміни майже вживаються взаємозамінно ... Мені довелося ввімкнути плагінсинхронізацію на моїх клієнтах, щоб уникнути деяких волохатих помилок. Я думав, що це модуль!

Поточні помилки клієнта:

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 конфігурація. Приклад нижче - це як демонстрація функціональності, так і вказівка ​​на велику довідкову колекцію конфігурацій ляльок - магазину конфігурації в реальному часі для серверів Вікіпедії.

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

Приклад Augeas також має конструкцію для класу sysctl на основі Augeus, яка схожа на те, що ви розмістили у своєму запитанні, так що також може пролити трохи світла.


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

@ewwhite Схоже, помилка, з якою ви пов’язані, може застосувати вашу ситуацію. Чи можете ви підтвердити, що модуль завантажується на вашу цільову машину?
Джефф Ферланд

Як я можу перевірити наявність модуля?
ewwhite

Ідемо з підходом до Аггеї. Я думаю, що я потрапив на помилку з іншим рішенням.
ewwhite

2

Раніше я використовував цей модуль з RHEL5: puppet-sysctl

Для його використання вам доведеться встановити модуль у папку модулів (ймовірно, / etc / puppet / module / 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

Таким чином, сайти-модулі містять дані про ієри або налаштування, а модулі залишаються загальними, підключеними та "модульними".


Так, це пов'язано в моєму питанні. Немає документації для модуля, і я не впевнений, де його встановити чи як реально ним користуватися.
ewwhite

Вибачте, що я не прочитав все ваше запитання :) Модуль містить визначення, яке потрібно викликати в іншому класі. Я відредагую свою відповідь і включу код ...
robbyt

Отже, з цим я отримую помилки: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".
robbyt

Визначення знаходиться в value.ppманіфесті, розподіленому з module-sysctlмодулем. Виглядає такdefine sysctl::value ( $key = 'name', $value ) {
ewwhite

0

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

Для зміни значення - якщо припустимо, що рядок вже існує - ви можете використовувати replaceв одному модулі.

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

Отже, чому це не робиться? Тому що Маріонетка розраховує на те, що ти повністю керуєш тим, чим ти керуєш. Тобто вам слід розподілити весь файл sysctl, а не просто додавати або видаляти те чи інше значення. Я не кажу, що це обов'язково легко зробити, але якщо ти можеш піти з цього, то це найпростіший спосіб зробити.


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

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