2017-12-09 2 views
1

異なる人形モジュールからクラスを拡張する必要があります。これは可能ですか?はいの場合、構文はどのようになりますか?異なる人形モジュールからクラスを拡張する

+0

そうすることは可能ですが、パペットクラス、特に別のモジュールからのクラスを拡張する必要はありません。 Puppet言語仕様は、その種類のドキュメントでは実際には非常に読みやすいです。 [構文について説明し、例を示します](https://puppet.com/docs/puppet/5.3/lang_classes.html#inheritance)。また、この機能の適切な使用法についてはほとんど触れていません。 –

答えて

3

パペットでは、クラスa :: bは、クラスを介してクラスaを継承することができます。これにより、クラスa :: bはクラスaを「拡張」することができます。

パペットはこれを行う必要はほとんどないことをお勧めします。特に、インクルード関数を使用して基本クラスをインクルードするだけで、継承によって達成できるもののほとんどを達成することができます。詳細については、文書hereを参照してください。

継承を使用する場合は、クラスaが自動的に最初に宣言されます。クラスaはクラスa :: bの親スコープになり、すべての変数とリソースのデフォルトのコピーを受け取ります。クラスa :: bのコードには、クラスaで設定されているリソース属性をオーバーライドする権限があります。

このパターンを使用すると、クラスa :: bはクラスパラメータの1つのデフォルトとしてクラスaの変数を使用することもできます。これにより、params.ppファイルを使用してクラスのデフォルトを設定する「paramsパターン」が作成されました。

次の簡単なコード例は、これらの機能の全てを示す:

class a { 
    File { 
    mode => '0755', 
    } 
    file { '/tmp/foo': 
    ensure => absent, 
    } 
    $x = 'I, Foo' 
} 

class a::b (
    $y = $a::x # default from class a. 
) inherits a { 

    # Override /tmp/foo's ensure 
    # and content attributes. 

    File['/tmp/foo'] { 
    ensure => file, 
    content => $y, 
    } 

    # Both /tmp/foo and /tmp/bar 
    # will receive the default file 
    # mode of 0755. 

    file { '/tmp/bar': 
    ensure => file, 
    } 
} 

とカタログの予想終了状態を表現するためにRSPECを使用して:

describe 'a::b' do 
    it 'overrides ensure attribute' do 
    is_expected.to contain_file('/tmp/foo').with({ 
     'ensure' => 'file', 
    }) 
    end 
    it 'inherits content from $x' do 
    is_expected.to contain_file('/tmp/foo').with({ 
     'content' => "I, Foo", 
    }) 
    end 
    it 'file defaults inherited' do 
    is_expected.to contain_file('/tmp/foo').with({ 
     'mode' => '0755', 
    }) 
    is_expected.to contain_file('/tmp/bar').with({ 
     'mode' => '0755', 
    }) 
    end 
end 

テストに合格:

a::b 
    overrides ensure attribute 
    inherits content from $x 
    file defaults inherited 

Finished in 0.15328 seconds (files took 1.2 seconds to load) 
3 examples, 0 failures 

「plusignment」についての注意。

また、ドキュメントで説明されているように、配列であるリソース属性をオーバーライドするときに、+> "plusignment"演算子を使用する代わりにその配列に追加することもできます。まれに使用される機能ですが、この文脈で言及する必要があります。コード例については、上のリンクを参照してください。

+1

良い答えですが、そのクラスの継承は、3.xの低さからPuppetによって落胆されており、高い4.x以降の 'params'の継承には注意が必要です。 –

+0

はい、私は、継承を使用する時期と使用しない時期についてのPuppetの推奨事項に注意を払うと言っていました。私はそれがまだ意見の問題だと思いますか?実際には、Craig Dunnの元の役割とプロファイルの記事で興味深い継承を使用しています。https://www.craigdunn.org/2012/05/239/ –

+1

2012年5月のクラス継承はまだOKと考えられていました。 –

関連する問題