木偶。以最有效的方式更改任何配置/文本文件

时间:2015-10-31 22:04:28

标签: config puppet

我正在学习如何使用Puppet。现在我正在尝试更改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':}

}

是否有可能以更有效的方式制作相同的内容?有阵列还是那样?

2 个答案:

答案 0 :(得分:3)

我建议您使用inifile puppet module轻松管理这样的INI风格文件,同时也可以利用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':}

}

答案 1 :(得分:0)

所以我写了这样的代码:

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

}

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

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

然后, inline_template 模块将生成带有ruby一行代码的regexp,从而将数组中的每个元素转换为 change_parameters 作为 $ name 参数。

对于list / array中的每个元素都是一样的。

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