2017-01-15 8 views
0

私は非常に多くの検索を行っていますが、私の新しさは、私が解決策を見つけるのを妨げています! は、ここに私の問題である(ないことCOMPLEXE、またはそう私は思った):ジンジャー変数を引数として使用すると、ジンジャーループで使用されます。

マイ柱データ:

server_access: 
    ops: 
    - salt-dev 
    ps: 
    - client-salt.example.com 
    rd: 
    ops_trainees: 

その後、私の神社のテンプレートの抜粋:

{% set ldap_search_filter_additionnal = [] %} 
{% for group in ['ops','ps','rd','ops_trainees'] %} 
{% for servers in salt['pillar.get']('server_access:{{ group }}', {}) %} 
{% if grains['fqdn'] == servers %} 
{% set ldap_search_filter_additionnal = ldap_search_filter_additionnal.append('(isMemberOf="cn={{ group }},ou=test,dc=example,dc=com")') %} 
{% endif %} 
{% endfor %} 
{% endfor %} 

私はをループに期待しています最初の4つの値、次にこれらの4つの値のそれぞれをsalt関数の引数として使用する2番目の(入れ子にされた)ループ、次にfqdnと一致する場合はldap検索フィルターなどを追加します。

しかし、塩関数呼び出しの中でジンジャ変数を使用することはできないようですね。

期待される動作を得るために何を専門家に勧めないのですか?

ボーナス:if文が真でないときにジンジャーループが "中断しない"ことを確認しますか?

おかげ

UPDATE_1

最初propositionof @Christophe Drevet-Droguet後: 私はそれを試してみましたが、私はそれを動作させることができなかった、または少なくとも私のニーズに合わせたが、私はやりました私はそれが次の試行で、最初の要素のために動作させる場合を除き、その作品「のようなもの」、何かを見つける:

{%- set ldap_search_filter_additionnal = [] -%} 
{%- for server_group, server_name in pillar['server_access'].iteritems() -%} 
{%- if grains['fqdn'] == server_name[0] -%} 
{%- set testo = '(isMemberOf=\"cn='+server_group+',ou=interne,dc=example,dc=com\")' -%} 
{%- set ldap_search_filter_additionnal = ldap_search_filter_additionnal.append(testo) -%} 
{%- endif -%} 
{% endfor %} 

私は(if文を使用して)一致していることを理解するだけでFiの"server_name [0]"の "[0]"のために最初の要素は、これまでより良いことはできませんので、私が必要とするように作品を作るために別の改善がある場合は、ください:)

UPDATE_2:

私は最終的に私が戦っていた行動を取るが、コードはやや厄介なので、誰かがそれを上級者にするためのヒントを持っていれば、そこに投げてください!

解決策の答えは以下のとおりです。

答えて

0

作業溶液:

{%- set ldap_search_filter_additionnal = [] -%} 
{%- for serverGroup, serverName in pillar.get('server_access', {}).iteritems() -%} 
{%- for serverNameFull in serverName -%} 
{%- if serverNameFull == grains['fqdn'] -%} 
{%- set testo = '(isMemberOf=\"cn='+serverGroup+',ou=interne,dc=eloquant,dc=com\")' -%} 
{%- set ldap_search_filter_additionnal = ldap_search_filter_additionnal.append(testo) -%} 
{%- endif -%} 
{% endfor %} 
{% endfor %} 

二ネストされたループは私を救ったものですが、もし私はこのソリューションを長い間前から考えていましたが、私はそれを受け入れることができませんでしたが、今は私の頭が燃えています。私はちょうどうまくいくものが必要です、このコードを改善してください。

+0

'serverName'を' serverList'で置き換え、 'serverNameFull'を' serverName'で置き換えると、コードを理解しやすくなります。それは、サーバー名ではなく、各グループの柱の中にサーバーのリストがあることです。サーバーが1つだけ必要な場合は、リストを使用するのではなく、単純な値を使用し、2番目のループは必要ありません。 –

+0

ありがとうございましたChristophe、あなたは私の変数名についてそうですよ!私は実際には複数のサーバーが必要なので、リストを使用しています。各グループにはテスト用のサーバーが1つしかありませんが(それは賢明ではありません)、各グループに複数のサーバーがあります...ありがとうあなたの洞察 – Pier

0

最初に、{{ group }}のシンタックスを、すでにジンジャ式に使用しているように使用することはできません。したがって、この構文を使用する必要があります:'server_access:' + group

第2に、あなたのピラーデータにはサーバーのリストが含まれていますので、空のリスト[]をデフォルト値として提供するので、式がリスト内にあれば同様に動作します柱かどうか。

{% for servers in salt['pillar.get']('server_access:' + group, []) %} 

ジンジャーは通常、誤った文で壊れません。ただし、変数が期待どおりの型でないと、簡単に破損します。したがって、[]デフォルト値。ボーナスとして

:dictの上で簡単に反復処理するために、私はこの構文を使用します。

{% for key, value in dict %} 
+0

お返事ありがとうChristopheありがとうございました。私はついにそれを受け取り、受け入れられた答えをご覧ください。 – Pier

関連する問題