Puppet - 如何在使用继承时覆盖类?

时间:2013-12-04 17:41:58

标签: class inheritance override puppet

我正在使用Puppet来管理我的CentOS服务器。

每个服务器都继承自“common”节点:

node 'common' {
    class { 'ssh:server':
        permit_root_login => no,
    }

    #[...] Other useful classes I want to keep
}

node default inherits 'common' {}

我想保留有用的“公共”节点,但只覆盖一个服务器的SSH部分:

node 'host.domain.com' inherits 'common' {
    class { 'ssh:server':
        permit_root_login => yes,
    }
}

显然,这不起作用。我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

这是节点继承通常不受欢迎的一个原因。在任何情况下,这里最好的策略是使用变量作为permit_root_login值,然后使用继承来通过hiera或者环境init.pp来初始化变量值。

所以在hiera的情况下,你的清单看起来像:

node 'common' {
    class { 'ssh::server':
        permit_root_login => hiera('is_permit_root_login_enabled'),
    }
}

node 'host.domain.com' inherits 'common' {}

然后在你的global.yaml hiera文件中你有:

is_permit_root_login_enabled: "no"

然后在你的覆盖yaml中,host.domain.com.yaml

is_permit_root_login_enabled: "yes"

我建议使用hiera,因为它是以这种继承为基础构建的,并且具有非常灵活的继承策略。