Đặt tham số sysctl.conf với Puppet


10

Đây là một làn gió trong CFEngine ... Nhưng hiện tại tôi đang ở trong môi trường Puppet và cần có khả năng gán / đảm bảo / kiểm tra các biến sysctl.conf nhất định. Trong thế giới CFEngine, tôi chỉ có thể kiểm tra các dòng cụ thể trong tệp cấu hình ... Tôi đã tìm thấy một tham chiếu nhỏ đến mô-đun sysctl trên wiki Puppet và một dự án trong github xuất hiện để làm những gì tôi muốn.

Nhưng không thực sự được ghi nhận tốt. Tôi chỉ đơn giản là tìm cách chỉnh sửa một vài giá trị như net.core.rmem_defaultnet.core.wmem_max. Trong định dạng của dự án được lưu trữ trên github , cấu hình trong tệp kê khai init.pp của tôi sẽ trông như sau:

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

Đi qua các diễn đàn và danh sách gửi thư, dường như có sự nhầm lẫn về sự khác biệt giữa các plugin và mô-đun rối. Các thuật ngữ gần như được sử dụng thay thế cho nhau ... Tôi cuối cùng cần phải kích hoạt pluginsync trên máy khách của mình để vượt qua một số lỗi lông. Tôi nghĩ rằng đây là một mô-đun!

Các lỗi máy khách hiện tại:

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

Bạn có suy nghĩ gì về cách thực hiện điều này với ít đau đớn nhất không?

Chỉnh sửa: Tôi có bị ảnh hưởng bởi lỗi này không?

Chỉnh sửa: Đã sửa lỗi sử dụng thư viện Augeas theo đề xuất của Jeff Ferland và từ wiki Puppet .

Tôi đã tạo một sysctlmô-đun ...

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

}

... và một mô-đun khác để đặt các cài đặt có liên quan ...

class prod_sysctl {

include sysctl

sysctl::conf {

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

Thật tuyệt vời. Bạn đã xem việc viết nó lên như một mô-đun được xuất bản trên lò rèn chưa?
TomOnTime

Câu trả lời:


14

Câu trả lời cụ thể: Nói ngay lập tức, bạn đang gọi sysctl :: value, nhưng giá trị không được khai báo trong lớp sysctl của bạn. Xem ví dụ này sử dụng khai báo sysctl :: conf. Không có define value, không có lớp con sysctl :: value để bạn gọi.


Câu trả lời và hướng dẫn chung: Cấu trúc Augeas (xem thêm tài liệu tham khảo loại của nó ) là một phần của các phiên bản hiện tại của Puppet cho phép duy trì các dòng trong tệp cấu hình và thậm chí tôn trọng ngữ cảnh, do đó nó có thể quản lý các tệp như cấu hình git. Ví dụ dưới đây là cả hai để thể hiện chức năng và để chỉ cho bạn một bộ sưu tập cấu hình rối lớn - kho lưu trữ cấu hình trực tiếp cho các máy chủ 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

Một ví dụ đơn giản từ tài liệu cấu hình ở trên sẽ là:

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

Vì vậy, nếu bạn muốn quản lý /etc/sysctl.conf của mình, hãy nhập thông tin sau:

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

Các ví dụ Augeas cũng có một cấu trúc cho một lớp sysctl dựa trên Augeus đó là tương tự như những gì bạn được đăng trong câu hỏi của bạn, do đó cũng có thể làm sáng tỏ.


Định nghĩa là trong một bảng value.ppkê khai được phân phối với module-sysctlmô-đun. Có vẻ nhưdefine sysctl::value ( $key = 'name', $value ) {
ewwhite

@ewwhite Có vẻ như lỗi bạn liên kết có thể áp dụng cho tình huống của bạn. Bạn có thể xác nhận rằng mô-đun đang tải trên máy mục tiêu của bạn?
Jeff Ferland

Làm thế nào tôi có thể kiểm tra sự hiện diện của mô-đun?
ewwhite

Đi với cách tiếp cận Augeas. Tôi nghĩ rằng tôi đã gặp một lỗi với giải pháp khác.
ewwhite

2

Tôi đã sử dụng mô-đun này trong quá khứ với RHEL5: rối-sysctl

Để sử dụng nó, bạn sẽ phải cài đặt mô-đun vào thư mục mô-đun của mình (có thể / etc / Puppet / mô-đun / sysctl) bao gồm lớp trên nút của bạn: (bao gồm sysctl) và sau đó gọi tài nguyên def như sau:

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

Vì vậy, bạn có thể tự hỏi, mã này thực sự đi đâu? Tôi thích tổ chức cây rối của tôi như thế này:

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

Theo cách đó, các mô-đun trang web chứa dữ liệu hiera hoặc điều chỉnh và các mô-đun giữ chung, có thể cắm và "mô-đun".


Vâng, nó được liên kết trong câu hỏi của tôi. Không có tài liệu cho mô-đun và tôi không chắc cài đặt nó ở đâu hoặc làm thế nào để thực sự sử dụng nó.
ewwhite

Xin lỗi tôi đã không đọc toàn bộ câu hỏi của bạn :) Mô-đun bao gồm một định nghĩa, cần được gọi trong một lớp khác. Tôi sẽ chỉnh sửa câu trả lời của mình và bao gồm mã ...
robbyt

Vì vậy, với các lỗi tôi nhận được là: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

Có vẻ như bạn đang gọi một định nghĩa có nhãn 'sysctl :: value' chứ không phải 'sysctl :: set_value'.
cướp

Định nghĩa là trong một bảng value.ppkê khai được phân phối với module-sysctlmô-đun. Có vẻ nhưdefine sysctl::value ( $key = 'name', $value ) {
ewwhite

0

Miễn là bạn không phải thay đổi giá trị (hoặc hài lòng với các dòng nối thêm với các giá trị mới), bạn có thể sử dụng Common's line . Bạn có thể sử dụng một cặp present/ absentcấu hình khi bạn thay đổi giá trị.

Để thay đổi giá trị - giả sử dòng đã tồn tại -, bạn có thể sử dụng replacetrong cùng một mô-đun.

Hoặc bạn có thể xem cách các định nghĩa này được viết để làm cho phù hợp với nhiệm vụ của bạn - điều này, theo tôi, tôi nghĩ là đơn giản và phổ biến đến mức nó phải được cung cấp bởi các loại rối mặc định.

Vậy tại sao không? Bởi vì Puppet mong bạn quản lý hoàn toàn những thứ bạn đang quản lý. Đó là, bạn nên phân phối toàn bộ tệp sysctl, thay vì chỉ thêm hoặc xóa một giá trị này hoặc giá trị khác. Tôi không nói rằng đó là một điều dễ dàng để làm, nhưng nếu bạn có thể thoát khỏi nó, thì đó là cách dễ nhất để làm điều đó.


Tôi không nghĩ việc quản lý toàn bộ tập tin là có thể mở rộng. Tôi biết rằng toàn bộ tùy chọn tệp là một khả năng, nhưng sử dụng trường hợp thay đổi nhỏ trong bản phát hành RHEL ... Có thể có các sysctl.confmặc định thay đổi giữa các phiên bản của RHEL. Chúng tôi có thể không muốn bỏ qua / ghi đè lên chúng, thay vì đảm bảo có thể đặt / thay đổi một tham số cụ thể.
ewwhite

@ewwhite Không phải RHEL có tệp ghi đè cục bộ sysctl.confkhông? Hay bạn có nghĩa là bạn có cấu hình khác nhau theo bản phát hành? Trong trường hợp sau, bạn có thể tạo mẫu và chọn các dòng tùy thuộc vào phiên bản HĐH.
Daniel C. Sobral
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.