2017-07-06 13 views
0

私たちは、Anjaを使ってJinja2テンプレートからiptablesルールを生成しています。ホストは、ネストされたグループであり、そのサブネットは、このようなインベントリファイル内の子グループ変数の変数として格納されます。Aniable/Jinja2サブグループ変数固有のフィルタはありますか?

[parent_group] 
[parent_group:children] 
child_group1 
    [child_group1] 
    FQDN1 
    FQDN2 
    [child_group1:vars] 
    subnet=10.0.0.0/24 

我々は、多くの子グループを持っているそれぞれのホストのために独自のサブネット/マスクで各グループ。 Anipal/Jinja2のドキュメントのほとんどはforループを使用してグループ変数を参照してメンバホスト上を反復することを指しており、テンプレートファイルに重複する行があります。 parent_groupのchild_group変数を1回だけ取得する最善の方法は何ですか? Jinja2 for-loopの一意の値をフィルタリングする方法はありますか?

答えて

1

parent_group内のホストの一意のサブネットのリストを取得するための式である:

{{ groups['parent_group'] | map('extract',hostvars,'subnet') | list | unique }} 

値抽出のこの技術はhere記載されています。

0

はJinja2の表現と周りのいくつか手探りの後、私は重複せずに子グループ変数に基づいてルールを作成するには、以下のテンプレートを思い付くことができました:ので、もし、それが私にはかなり無骨な感じ

{% set subnets = [] %} 
{% for host in groups['parent_group'] %} 
{% if hostvars[host].subnet not in subnets %} 
-A INPUT -s {{hostvars[host].subnet}} -j ACCEPT {{subnets.append(hostvars[host].subnet)}} 
{% endif %} 
{% endfor %} 

誰より良い方法を知っている、私は本当にそれを感謝します。ここで

関連する問題