Set parameter sysctl.conf dengan Wayang

10

Ini sangat mudah di CFEngine ... Tapi saya berada di lingkungan Wayang sekarang, dan harus dapat menetapkan / memastikan / memeriksa variabel sysctl.conf tertentu. Di dunia CFEngine, saya cukup memeriksa baris tertentu dalam file konfigurasi ... Saya telah menemukan referensi kecil ke modul sysctl pada wiki Wayang dan sebuah proyek di github yang tampaknya melakukan apa yang saya inginkan.

Tetapi tidak ada yang benar-benar didokumentasikan dengan baik. Saya hanya mencari cara untuk mengedit beberapa nilai seperti net.core.rmem_defaultdan net.core.wmem_max. Dalam format proyek yang dihosting di github , konfigurasi dalam manifes init.pp saya akan terlihat seperti:

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";
        }
}

Melalui forum dan milis, tampaknya ada kebingungan tentang perbedaan antara plugin dan modul Wayang. Istilah ini hampir digunakan secara bergantian ... Saya akhirnya perlu mengaktifkan pluginsync pada klien saya untuk melewati beberapa kesalahan berbulu. Saya pikir ini adalah modul!

Kesalahan klien saat ini:

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

Adakah pemikiran tentang bagaimana menyelesaikan ini dengan paling sedikit rasa sakit?

Sunting: Apakah saya terpengaruh oleh bug ini ?

Sunting: Diperbaiki menggunakan perpustakaan Augeas seperti yang disarankan oleh Jeff Ferland dan dari wiki Wayang .

Saya membuat sysctlmodul ...

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

}

... dan modul lain untuk mengatur pengaturan yang relevan ...

class prod_sysctl {

include sysctl

sysctl::conf {

  # increase PID rollover value
  "kernel.pid_max": value =>  "1048576";
  }
}
putih
sumber
Ini luar biasa. Sudahkah Anda mempertimbangkan untuk menulis ini sebagai modul yang diterbitkan di boneka wayang?
TomOnTime

Jawaban:

14

Jawaban spesifik: Segera berbicara, Anda memanggil sysctl :: value, tetapi nilai tidak dinyatakan dalam kelas sysctl Anda. Lihat contoh ini yang menggunakan deklarasi sysctl :: conf. Tanpa define value, tidak ada subclass sysctl :: value untuk Anda panggil.


Jawaban umum dan bimbingan: The Augeas membangun (lihat juga yang jenis dokumentasi referensi ) yang merupakan bagian dari versi saat ini dari Wayang memungkinkan mempertahankan baris dalam file konfigurasi dan bahkan hal konteks, sehingga dapat mengelola file seperti konfigurasi git. Contoh di bawah ini adalah untuk mendemonstrasikan fungsionalitas dan mengarahkan Anda ke koleksi referensi konfigurasi Wayang yang hebat - toko konfigurasi langsung untuk server Wikipedia.

[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

Satu contoh sederhana dari dokumentasi konfigurasi di atas adalah ini:

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

Jadi, jika Anda ingin mengelola /etc/sysctl.conf Anda, masukkan yang berikut ini:

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

Contoh Augeas juga memiliki konstruksi untuk kelas sysctl berdasarkan Augeus yang mirip dengan apa yang Anda posting dalam pertanyaan Anda, sehingga mungkin juga memberi sedikit cahaya.

Jeff Ferland
sumber
Definisinya ada dalam value.ppmanifes yang didistribusikan bersama module-sysctlmodul. Sepertinyadefine sysctl::value ( $key = 'name', $value ) {
ewwhite
@ewwhite Sepertinya bug yang Anda tautkan dapat diterapkan pada situasi Anda. Bisakah Anda mengonfirmasi bahwa modul memuat pada mesin target Anda?
Jeff Ferland
Bagaimana saya bisa memeriksa keberadaan modul?
ewwhite
Pergi dengan pendekatan Augeas. Saya pikir saya telah menemukan bug dengan solusi lain.
ewwhite
2

Saya telah menggunakan modul ini di masa lalu dengan RHEL5: puppet-sysctl

Untuk menggunakannya, Anda harus menginstal modul ke folder modul Anda (mungkin / etc / puppet / modules / sysctl) termasuk kelas pada node Anda: (termasuk sysctl) dan kemudian panggil sumber daya def seperti ini:

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 }
}

Jadi Anda mungkin bertanya-tanya, kemana kode ini sebenarnya pergi? Saya suka mengatur pohon boneka saya seperti ini:

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

Dengan cara itu, modul-situs berisi data hiera, atau tunables, dan modul-modulnya tetap generik, dapat dipasang, dan "modular".

robbyt
sumber
Ya, itu tertaut dalam pertanyaan saya. Tidak ada dokumentasi untuk modul ini dan saya tidak yakin di mana akan menginstalnya atau bagaimana cara menggunakannya.
ewwhite
Maaf saya tidak membaca seluruh pertanyaan Anda :) Modul ini menyertakan define, yang perlu dipanggil di kelas lain. Saya akan mengedit jawaban saya dan memasukkan kode ...
robbyt
Maka dengan itu, kesalahan yang saya terima adalah: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
Sepertinya Anda memanggil definisi berlabel 'sysctl :: value' dan bukan 'sysctl :: set_value'.
robbyt
Definisinya ada dalam value.ppmanifes yang didistribusikan bersama module-sysctlmodul. Sepertinyadefine sysctl::value ( $key = 'name', $value ) {
ewwhite
0

Selama Anda tidak harus mengubah nilai (atau puas dengan menambahkan baris dengan nilai-nilai baru), Anda dapat menggunakan Common line . Anda dapat menggunakan sepasang present/ absentkonfigurasi saat Anda mengubah nilainya.

Untuk mengubah nilai - dengan asumsi garis sudah ada -, Anda dapat menggunakan replacemodul yang sama.

Atau Anda dapat melihat bagaimana definisi-definisi ini ditulis untuk menjadikannya sesuai dengan tugas Anda - yang, menurut Anda, menurut saya sederhana dan cukup umum sehingga seharusnya disediakan oleh jenis wayang standar.

Jadi, mengapa tidak? Karena Wayang mengharapkan Anda untuk sepenuhnya mengelola hal-hal yang Anda kelola. Artinya, Anda harus mendistribusikan seluruh file sysctl, alih-alih hanya menambahkan atau menghapus satu nilai atau lainnya. Saya tidak mengatakan bahwa itu selalu hal yang mudah untuk dilakukan, tetapi jika Anda dapat melakukannya, Anda itulah cara termudah untuk melakukannya.

Daniel C. Sobral
sumber
Saya rasa mengelola seluruh file tidak dapat diskalakan. Saya tahu bahwa seluruh opsi file kemungkinan, tetapi gunakan kasus perubahan kecil dalam rilis RHEL ... Mungkin ada sysctl.confdefault yang berubah di antara versi RHEL. Kami mungkin tidak ingin mengabaikan / menimpa itu, daripada memastikan parameter tertentu dapat diatur / diubah.
ewwhite
@ewwhite Tidakkah RHEL memiliki file override lokal sysctl.conf? Atau maksud Anda Anda memiliki konfigurasi yang berbeda sesuai dengan rilis? Dalam kasus yang terakhir, Anda dapat membuat templat dan memilih garis tergantung pada versi OS.
Daniel C. Sobral