ตั้งค่าพารามิเตอร์ sysctl.conf ด้วย Puppet


10

นี่เป็นเรื่องง่ายในCFEngine ... แต่ตอนนี้ฉันอยู่ในสภาพแวดล้อมหุ่นกระบอกและต้องสามารถกำหนด / ทำให้แน่ใจ / ตรวจสอบตัวแปร sysctl.conf บางอย่างได้ ในโลก CFEngine ฉันสามารถตรวจสอบเฉพาะบรรทัดภายในไฟล์ปรับแต่ง ... ฉันได้พบการอ้างอิงเล็กน้อยถึงโมดูล sysctlใน Puppet wiki และโครงการใน 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 แนะนำโดยเจฟฟ์ Ferland และจากวิกิพีเดียหุ่นกระบอก

ฉันสร้าง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 declaration หากไม่มีdefine valueจะไม่มีคลาสย่อย sysctl :: value สำหรับให้คุณโทร


คำตอบและคำแนะนำทั่วไป:โครงสร้างของAugeas (ดูเอกสารอ้างอิงประเภทของมัน) ซึ่งเป็นส่วนหนึ่งของ Puppet เวอร์ชันปัจจุบันช่วยให้สามารถรักษาบรรทัดในไฟล์กำหนดค่าและแม้แต่บริบทที่เกี่ยวข้อง ตัวอย่างด้านล่างเป็นทั้งเพื่อสาธิตการใช้งานและชี้ให้คุณเห็นคอลเลกชันอ้างอิงที่ดีของ Puppet configs - ที่เก็บการกำหนดค่าสดสำหรับเซิร์ฟเวอร์ 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

ตัวอย่างง่ายๆจากเอกสารการกำหนดค่าข้างต้นคือ:

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

@ whitewhite ดูเหมือนว่าข้อผิดพลาดที่คุณเชื่อมโยงกับสามารถนำไปใช้กับสถานการณ์ของคุณ คุณสามารถยืนยันได้ว่าโมดูลกำลังโหลดบนเครื่องเป้าหมายของคุณหรือไม่
Jeff Ferland

ฉันจะตรวจสอบสถานะของโมดูลได้อย่างไร
ewwhite

ไปตามแนวทาง Augeas ฉันคิดว่าฉันทำข้อผิดพลาดด้วยวิธีอื่น
ewwhite

2

ฉันเคยใช้โมดูลนี้ในอดีตกับ RHEL5: puppet-sysctl

ในการใช้งานคุณจะต้องติดตั้งโมดูลไปยังโฟลเดอร์โมดูลของคุณ (อาจเป็น / etc / puppet / modules / sysctl) รวมคลาสบนโหนดของคุณ: (รวม 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 หรือ tunables และโมดูลยังคงเป็นแบบทั่วไปแบบเสียบได้และ "แบบแยกส่วน"


ใช่มันเชื่อมโยงกับคำถามของฉัน ไม่มีเอกสารประกอบสำหรับโมดูลและฉันไม่แน่ใจว่าจะติดตั้งที่ไหนหรือจะใช้งานอย่างไร
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 ไม่มีไฟล์ override สำหรับsysctl.confใช่หรือไม่ หรือคุณหมายถึงคุณมีการกำหนดค่าที่แตกต่างกันตามการวางจำหน่าย? ในกรณีหลังคุณสามารถสร้างเทมเพลตและมีการเลือกบรรทัดตามรุ่นของระบบปฏิบัติการ
Daniel C. Sobral
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.