木偶。以最有效的方式更改任何 config/text 文件

Puppet. Change any config/text file in most efficient way

我正在学习如何使用 Puppet。现在我正在尝试更改 nscd 的配置文件。我需要更改这些行:

server-user             nscd
paranoia                yes

让我们假设完整配置如下所示:

$猫/etc/nscd/nscd.conf

    logfile                 /var/log/nscd.log
    threads                 4
    max-threads             32
    server-user             nobody
    stat-user               somebody
    debug-level             0
    reload-count            5
    paranoia                no
    restart-interval        3600

之前我写过这样的模块来替换需要的行,它看起来如下:

include nscd

class nscd {

    define line_replace ($match) {
        file_line { $name:
            path => '/etc/nscd/nscd.conf',  
            line => $name,
            match => $match,
            notify  => Service["nscd"]
        }
    }

    anchor{'nscd::begin':}
    ->
    package { 'nscd': 
        ensure => installed,
    }
    ->

    line_replace {
        "1" : name => "server-user   nscd", match => "^\s*server-user.*$";
        "2" : name => "paranoia      yes",  match => "^\s*paranoia.*$";
        }
        ->    

    service { 'nscd':
        ensure  => running,
        enable  => "true",
    }
    ->
    anchor{'nscd::end':}

}

有没有可能以更有效的方式制作同样的东西?用数组之类的?

我推荐你使用inifile puppet module to easy manage INI-style files like this, but also you can take advantage of the create_resources函数:

include nscd

class nscd {

    $server_user_line = 'server-user   nscd'
    $paranoia_line = 'paranoia      yes'

    $defaults = {
        'path'   => '/etc/nscd/nscd.conf',
        'notify' => Service["nscd"],
    }

    $lines = {
        $server_user_line => {
            line => $server_user_line,
            match => "^\s*server-user.*$",
        },
        $paranoia_line => {
            line => $paranoia_line,
            match => "^\s*paranoia.*$",
        }
    }

    anchor{'nscd::begin':}
    ->

    package { 'nscd': 
        ensure => installed,
    }
    ->

    create_resources(file_line, $lines, $defaults)
    ->   

    service { 'nscd':
        ensure  => running,
        enable  => "true",
    }
    ->

    anchor{'nscd::end':}

}

所以我写了这样的代码:

class nscd($parameters) {

    define change_parameters() {
        file_line { $name:
            path  => '/etc/nscd.conf',
            line  => $name,
            # @name.split[0..-2] will remove last element,
            # does not matter how many elements in line
            match => inline_template('<%="^\s*"+(@name.split[0..-2]).join("\s*")+".*$" %>'),
        }  
    }


    anchor{'nscd::begin':}
    ->

    package { 'nscd':
        ensure => installed,
    }
    ->

    change_parameters { $parameters: }
    ->

    service { 'nscd':
        ensure     => 'running',
        enable     => true,
        hasrestart => true
    }

    ->
    anchor{'nscd::end':}

}

和class可以通过将list/array传递给class来启动:

  class { 'nscd':
          parameters =>
             ['        server-user             nscd',
              '        paranoia                yes',
              '        enable-cache            hosts           yes          smth',
              '        shared                  hosts           yes']
    }

然后数组中的每个元素都进入 change_parameters 作为 $name 参数 inline_template 模块将使用 ruby 一行代码生成正则表达式。

list/array 中的每个元素都相同。

但无论如何我认为最好使用 erb 模板进行此类更改。