Config 傀儡。以最有效的方式更改任何配置/文本文件

Config 傀儡。以最有效的方式更改任何配置/文本文件,config,puppet,Config,Puppet,我正在学习如何使用木偶。现在我正在尝试更改nscd的配置文件。我需要更改这些行: server-user nscd paranoia yes 让我们假设完整配置如下所示: $cat/etc/nscd/nscd.conf logfile /var/log/nscd.log threads 4 max-threads 32 s

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

server-user             nscd
paranoia                yes
让我们假设完整配置如下所示:

$cat/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':}

}

是否有可能以更有效的方式实现同样的目标?使用数组或类似的方式?

我建议您使用,以便像这样轻松管理INI样式的文件,但您也可以利用以下功能:

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

}
然后数组中的每个元素都转到change_parameters函数作为$name参数,然后inline_模板将生成带有ruby单行代码的regexp

列表/数组中的每个元素都是相同的


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

您是否试图允许使用更舒适的符号?您始终可以使用自定义的
定义
来包装
行\u replace
类型。是的,其他变体对我来说很有趣。
augeas
是一个选项,或者使用
erb
模板来管理整个配置,其中augeas无法与任何配置一起正常工作。例如,我可以在sshd_config*中更改参数,在*nscd.conf中更改超高。但也许这个问题在我手里。)谢谢另一个变体是创建资源。这不是ini样式配置。
  class { 'nscd':
          parameters =>
             ['        server-user             nscd',
              '        paranoia                yes',
              '        enable-cache            hosts           yes          smth',
              '        shared                  hosts           yes']
    }