Kukla ile sysctl.conf parametrelerini ayarlama


10

Bu CFEngine'de bir esinti oldu ... Ama şimdi bir Kukla ortamındayım ve bazı sysctl.conf değişkenlerini atayabilmemizi / sağlamamayı / kontrol edebilmem gerekiyor. CFEngine dünyasında, ben sadece bir yapılandırma dosyası içinde belirli satırları kontrol edebilir ... Kukla wiki sysctl modülüne küçük bir referans ve github bir proje istediğim gibi görünüyor buldum.

Ancak ikisi de gerçekten iyi belgelenmemiştir. Sadece net.core.rmem_defaultve gibi birkaç değeri düzenlemenin bir yolunu arıyorum net.core.wmem_max. Github'da barındırılan proje biçiminde, init.pp manifest'imdeki yapılandırma şöyle görünmelidir:

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

Forumlardan ve posta listelerinden geçerken, Kukla eklentileri ve modülleri arasındaki fark konusunda karışıklık var gibi görünüyor. Terimler neredeyse birbirinin yerine kullanılıyor ... Bazı tüylü hataları aşmak için müşterilerimde pluginsync'i etkinleştirmem gerekiyordu. Bunun bir modül olduğunu düşündüm!

Geçerli istemci hataları:

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

Bunu en az acıyla nasıl başaracağınıza dair herhangi bir düşünce var mı?

Düzenleme: Bu hatadan etkileniyor muyum ?

Düzenleme: Jeff Ferland ve Kukla wiki tarafından önerilen Augeas kütüphanesi kullanılarak düzeltildi .

Bir sysctlmodül oluşturdum ...

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

}

... ve ilgili ayarları yapmak için başka bir modül ...

class prod_sysctl {

include sysctl

sysctl::conf {

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

Bu mükemmel. Bunu kukla forge'da yayınlanan bir modül olarak yazmayı düşündünüz mü?
TomOnTime

Yanıtlar:


14

Özel cevap: Hemen konuşursak, sysctl :: value diyorsunuz, ancak sysctl sınıfınızda değer bildirilmiyor. Bir sysctl :: conf bildirimi kullanan bu örneğe bakın . Olmadan, define valuearamanız gereken sysctl :: value alt sınıfı yoktur.


Genel cevabı ve rehberlik: Augeas yapı (aynı zamanda bkz tip referans belgelerine böyle bir git yapılandırması gibi dosyaları yönetebilirsiniz böylece) Kuklanın güncel sürümleri parçasıdır, bir yapılandırma dosyası ve hatta saygı bağlamında hatları muhafaza sağlar. Aşağıdaki örnek hem işlevselliği göstermek hem de sizi Kukla yapılandırmalarının büyük bir referans koleksiyonuna (Wikipedia sunucuları için canlı yapılandırma deposu) yönlendirmektir.

[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

Yukarıdaki yapılandırma belgelerinden basit bir örnek şudur:

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

Bu nedenle, /etc/sysctl.conf dosyanızı yönetmek istiyorsanız aşağıdakileri girin:

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

Augeas örnek olması da bazı ışık tutabilir, böylece aynı zamanda, sorunuzun gönderilmiş ne benzer olduğunu Augeus dayalı bir sysctl sınıfı için bir yapıyı sahiptir.


Define, modülle value.ppbirlikte dağıtılan bir bildirimdedir module-sysctl. Öyle görünüyordefine sysctl::value ( $key = 'name', $value ) {
ewwhite

@ewwhite Bağlandığınız hatanın durumunuza uygulanabileceği anlaşılıyor. Modülün hedef makinenize yüklendiğini onaylayabilir misiniz?
Jeff Ferland

Modülün varlığını nasıl kontrol edebilirim?
ewwhite

Augeas yaklaşımı. Sanırım diğer çözümde bir hataya çarptım.
ewwhite

2

Bu modülü geçmişte RHEL5 ile kullandım: kukla-sysctl

Bunu kullanmak için modülü modüller klasörünüze kurmanız gerekir (muhtemelen / etc / kukla / modules / sysctl) düğümünde sınıfı içerir: (sysctl dahil) ve sonra def kaynağını şöyle çağırmanız gerekir:

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

Merak ediyor olabilirsiniz, bu kod aslında nereye gidiyor? Kukla ağacımı şu şekilde organize etmeyi seviyorum:

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

Bu şekilde, site modülleri hiera verileri veya ayarlanabilirler içerir ve modüller genel, takılabilir ve "modüler" kalır.


Evet, sorumla bağlantılı. Modül için herhangi bir belge yoktur ve onu nereye kuracağınızdan veya nasıl kullanacağınızdan emin değilim.
ewwhite

Maalesef tüm sorunuzu okumadım :) Modül, başka bir sınıfta çağrılması gereken bir tanım içeriyor. Cevabımı düzenleyeceğim ve kodu
ekleyeceğim

Böylece, aldığım hatalar: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

Görünüşe göre 'sysctl :: set_value' değil, 'sysctl :: value' etiketli bir tanım çağırıyorsunuz.
robbyt

Define, modülle value.ppbirlikte dağıtılan bir bildirimdedir module-sysctl. Öyle görünüyordefine sysctl::value ( $key = 'name', $value ) {
ewwhite

0

Sürece gerekmez olarak değiştirmek değerini (veya yeni değerlerle hatları ekleme memnun olduğunu), kullanabilirsiniz Ortak en line . Değeri değiştirdiğinizde bir çift present/ absentyapılandırma kullanabilirsiniz .

Değeri değiştirmek için - hattın zaten var olduğu varsayılarak - replaceaynı modülde kullanabilirsiniz.

Ya da bu tanımların görevinize uygun hale getirmek için nasıl yazıldığına bakabilirsiniz - ki, sanırım, varsayılan Kukla türleri tarafından sağlanması gereken kadar basit ve yaygındır.

Peki neden olmasın? Çünkü Kukla yönettiğiniz şeyleri tam olarak yönetmenizi bekliyor. Yani, bir değeri veya başka bir değeri eklemek veya kaldırmak yerine tüm sysctl dosyasını dağıtmanız gerekir . Bunun mutlaka yapılması kolay bir şey olduğunu söylemiyorum, ama ondan kurtulabilirseniz, bunu yapmanın en kolay yolu budur.


Tüm dosyayı yönetmenin ölçeklenebilir olduğunu düşünmüyorum. Tüm dosya seçeneğinin bir olasılık olduğunu biliyordum, ancak bir RHEL sürümündeki küçük değişiklikler durumunda ... sysctl.confRHEL sürümleri arasında değişen varsayılanlar olabilir . Belirli bir parametrenin ayarlanabilmesini / değiştirilebilmesini sağlamak yerine bunları yoksaymak / üzerine yazmak istemeyebiliriz.
ewwhite

@ewwhite RHEL için yerel bir geçersiz kılma dosyası yok sysctl.confmu? Yoksa sürüme göre farklı yapılandırmalarınız var? İkinci durumda, işletim sistemi sürümüne bağlı olarak bir şablon oluşturabilir ve satırları seçebilirsiniz.
Daniel C. Sobral
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.