3

すべてのサーバーの「テンプレート」を作成しようとしています。2つの構成があります。NTPクライアント(baseclassクラスで処理されます。ノード宣言で特定の何かを宣言することにより、NTPサーバーに固有のオーバーライドを作成したいと思います。「baseclass :: ntp:restrict=>true」のようなもの。またはまたは、すでに宣言されている変数の1つをbaseclass :: ntpから変更するにはどうすればよいですか?

誰かがこれを行うためのアイデアホストを持っていますか?

これは私がこれまでに持っているものです:

templates.pp

class baseclass {
    include defaultusers
    include sudoers
    include issue

    class { ntp:
            ensure => running,
            servers => ['ntpserver1.host.com',
                        'ntpserver2.host.com',],
            autoupdate => false,
    }
}

ノード.pp

node default {
    include baseclass
}

node "ntpserver1.host.com" inherits default {
    <some code here to declare new variable in baseclass::ntp>
    <some code here to change existing variable, such as "ensure">
}
4

2 に答える 2

5

パラメータ化されたクラスの問題にぶつかりました。オーバーライドはサポートされていません。すべきですが、Puppetで初期化される順序に関するさまざまな問題のため、クラスのパラメーターをオーバーライドすることはできません。それらを設定すると、完了です。これは、オーバーライドパラメータが期待どおりに機能するdefineとは異なります。これについては、多くの人が投票して監視しているという未解決のバグがありますが、ほとんど進展がないようです。

それを考えると、定義は希望どおりに機能するため、代わりにパラメーター化されたntpクラスを定義として再キャストすることをお勧めします。クラスを次のように変更します。

define ntp($servers, $autoupdate = false, $ensure = 'running') {
  # ... put code from class here ...
}

次に、ベースクラスを次のように変更します。

ntp { $fqdn:
  servers => [ 'ntpserver1.host.com',
               'ntpserver2.host.com',],
}

ノード内のクラスから継承することはできないため、新しいクラスを追加するには、クラス構造を変更する必要があります。そのため、ノードを次のように変更します。

node "ntpserver1.host.com" inherits default {
  include hosts::ntpserver1
}

または、ホストごとの構成クラスに名前を付けたい場合。次に、そのクラスで、期待どおりのことを正確に実行できます。

class hosts::ntpserver1 inherits baseclass {
  Ntp["$fqdn"] { ensure => 'stopped' }
}

特に、ノード(クラス継承ツリーに参加していない)内でたくさんのことを行うことに慣れている場合は、これは大きな回避策のように思えます。しかし、クラスへのパラメーターをオーバーライドすることができなければ、良い代替手段はないようです。(この方法を使用して、500以上のノードと約100の完全に別個のサービス定義を管理し、数百のモジュールとホストごとのオーバーライドを含むホスト間の膨大な多様性を備えています。これは非常にうまく機能します。)

TL、DRの概要:クラスパラメーターをオーバーライドすることはできません。Puppetのクラスにパラメーターを渡したら、完了です。定義パラメーターをオーバーライドできます。したがって、オーバーライドしたいものはすべて、クラスよりも定義として記述した方が適切です。ただし、オーバーライド階層は、クラスのみが別のクラスから継承してオーバーライドできるため、ノード定義のコアをクラスに配置する必要があることを意味することに注意してください。したがって、オーバーライドを頻繁に使用する場合は、ノード定義を簡単にする習慣を身に付けて(すべての作業を行うクラスを含めるだけで)、クラスが基本クラスから継承し、定義するパラメーターをオーバーライドできるようにします。

于 2013-03-26T03:25:53.797 に答える
1

私はrraの答えを受け入れましたが、私にとってもう少しうまくいく解決策を見つけました。それはちょっとしたハックだと思います:

template.pp

class baseclass ($ntprestrict = 'false') {
    include defaultusers
    include sudoers
    include issue

    class { ntp:
            ensure => running,
            servers => ['ntpserver1.host.com',
                        'ntpserver2.host.com',],
            autoupdate => false,
            restrict => $ntprestrict,
    }
}

ノード.pp

node "ntpserver1.host.com" {
    class { baseclass: ntprestrict => 'true' }
}
node "client.host.com" {
    class { baseclass: ntprestrict => 'false' }
}
于 2013-03-26T21:38:54.333 に答える