木偶。使用带有 2 个变量的定义

Puppet. Using define with 2 variables

我有配置文件 /home/ipeacocks/Dropbox/nscd/nscd.conf:

$ cat home/ipeacocks/Dropbox/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

使用木偶我想改变 2 行:

        server-user             nobody
        paranoia                no

到这些行:

        server-user             nscd
        paranoia                yes

因此,为了更改第一行,我可以使用这样的清单:

include nscd

class nscd {

    define line_replace ($line, $match) {
        file_line {'some useful info':
            path => '/home/ipeacocks/Dropbox/nscd/nscd.conf',  
            line => $line,
            match => $match
        }
    }

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

    line_replace {'test':
        line => "server-user             nscd",
        match => "^\s*server-user.*$"
        }
        ->

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

}

人偶发射:

» sudo puppet apply /home/ipeacocks/Dropbox/nscd/nscd.pp
Notice: Compiled catalog for softserve-pc.ddns.softservecom.com in environment production in 0.37 seconds
Notice: /Stage[main]/Nscd/Nscd::Line_replace[test]/File_line[some useful info]/ensure: created
Notice: Finished catalog run in 0.22 seconds

但是当 2 行时不能(使用声明的函数两次):

include nscd

class nscd {

    define line_replace ($line, $match) {
        file_line {'some useful info':
            path => '/home/ipeacocks/Dropbox/nscd/nscd.conf',  
            line => $line,
            match => $match
        }
    }

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

    line_replace {'test':
        line => "server-user             nscd",
        match => "^\s*server-user.*$"
        }
        ->

    line_replace {'test2':
        line => "paranoia                yes",
        match => "^\s*paranoia.*$"
        }
        ->

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

}

再次启动:

» sudo puppet apply /home/ipeacocks/Dropbox/nscd/nscd.pp                                                                                                                1 ↵
Error: Duplicate declaration: File_line[some useful info] is already declared in file /home/ipeacocks/Dropbox/nscd/nscd.pp:10; cannot redeclare at /home/ipeacocks/Dropbox/nscd/nscd.pp:10 on node softserve-pc.ddns.softservecom.com
Error: Duplicate declaration: File_line[some useful info] is already declared in file /home/ipeacocks/Dropbox/nscd/nscd.pp:10; cannot redeclare at /home/ipeacocks/Dropbox/nscd/nscd.pp:10 on node softserve-pc.ddns.softservecom.com

有什么问题吗?是否可以一次将两对变量传递给声明的函数(使用数组或类似的)?

我试过这个解决方案,但它对我不起作用:

用这个替换你的定义:

define line_replace ($line, $match) {
    file_line {$name:
        path => '/home/ipeacocks/Dropbox/nscd/nscd.conf',  
        line => $line,
        match => $match
    }
}

我将 file_line 资源名称从常量更改为您定义的 $name 参数。

将 'some useful info' 更改为 file_line 中的 $name -

define line_replace ($line, $match) {
    file_line {$name:
        path => '/home/ipeacocks/Dropbox/nscd/nscd.conf',  
        line => $line,
        match => $match
    }
}

您面临的问题是因为对 line_replace 的第二次调用导致调用 file_line 并且资源名称 'some useful info' 已经声明。