web-dev-qa-db-ja.com

Puppet-ERBテンプレート-定義されたクラスに関する質問

Puppetテンプレートファイルはerb Railsファイルです。

私は行が欲しい:

Include modsecurity.d/*.conf

クラスmod_securityが含まれている場合、最終ファイルに含まれます。

Puppetドキュメントから: http://docs.puppetlabs.com/guides/templating.html -

そして、このスニペットは、カタログで定義されたすべてのクラスを出力します。

<% classes.each do |klass| -%>
The class <%= klass %> is defined
<% end -%>

条件付き:

<% if broadcast != "NONE" %>        broadcast <%= broadcast %> <% end %>

私は構文に不慣れです。定義されたものは含まれているものと同じ意味ですか?条件付きの場合、特定のクラスをどのようにチェックしますか?つまり、isdefined(mod_security)...?

2
Joshua Enfield

定義されたクラスは、クラスが含まれていることを意味します。明確にするために、<% if broadcast ...ビットは、ブロードキャストクラスの包含をチェックする方法ではなく、ブロードキャスト変数の値を使用する条件の構文に対して、classes配列に定義されたすべてのクラスの名前が含まれます。

これは、たとえばmod_securityクラスをチェックする方法です。

 <%if classes.include?( "mod_security")%> 
条件付きテキスト
 <%end%> 

編集:

おっと...メソッドはインクルードと呼ばれていますか?含まれていませんか?上記を修正しました。

3
mark

クラスが 'classes'変数に含まれるかどうかは、パペットの実行でwhenに依存するため、これを行う場合は注意が必要です。この特定のテンプレートが評価され、非決定論的である可能性があります。テンプレートが評価され、後で実行中にmod_securityクラスが含まれて評価される可能性は十分にあります。

これを回避する2つの方法:

  1. 外部ノード分類器によって追加されることを保証できる場合は、安全です

  2. さらに良いことに、mod_securityの存在を確認するカスタムファクトを作成し、そのファクト名を条件変数として使用します。

    Facter.add( "mod_security_version")do setcode do version =%{rpm -qa | grep mod_security} if version.empty?バージョン= 0終了バージョン終了終了

次に、テンプレートで:

<% if ! mod_security_version.eql?("0") %>
Include modsecurity.d/*.conf
<% end %>

すべてのファクトファクトはERBに到達すると文字列になるため、これは文字列の比較(mod_security_version != 0ではない)である必要があることに注意してください。

3
eric sorenson