2016-11-07 11 views
0

私はJinja2にはかなり新しく、これを実現する方法が不思議です。Anipal/Jinja2での複雑なフィルタリング

は、私は次のようvarsを持って言う:

--- 
servers: 
    192.168.0.1: 
    names: 
     - foo.example.com 
     - foo 
    exports: 
     data: 
     foo1: /disks/foo1 
     foo2: /disks/foo2 
    192.168.0.2: 
    ... 

私は/disks/foo2/disks/foo1/data/foo2にシンボリックリンク/data/foo1を作成したいのですが、唯一のfooサーバー上;他のサーバーでは、それぞれのエクスポートにシンボリックリンクを作成します。だから私はfile status=link with_items=...が正しいことだと思った。 Pythonでは、以下のロジックを使用して必要な配列を得ることができます:

[ 
    { 'mount': mount, 'export': export } 
    for ip, server in servers.iteritems() 
    if ansible_hostname in server['names'] 
    and 'exports' in server 
    and 'data' in server['exports'] 
    for mount, export in server['exports']['data'].iteritems()' 
] 

私はJinja2でこれを行う方法がわかりません。私は

{{ servers | select('ansible_hostname in self.names') | ... }} 

のようにしたかったが、うまくいかなかった。このロジック用のプラグインを作成する必要がありますか?または私のアプローチがすべて間違っていると私はserversデータの構造を再考する必要がありますか?私のコメントから

+0

なぜ 'servers [ansible_hostname] .exports.data'にループしないのですか? –

+0

@ ConstantinSuvorov: 'ansible_hostname'のどの形式が必要なのか分かりません。今、私はそれを愚かに思っています。おそらく私が '目録 'に入れたものでしょうか?私は明日それを試して遊びます。その間、私はまだJinja2の複雑な変換について興味があります。 – Amadan

+0

通常は 'inventory_hostname'変数を使います。これは、インベントリのホスト名として使用します。 'servers [ansible_hostname]'は 'anals_hostname'の値で' servers'キーにアクセスします。ただ好奇心のために、あなたがチェックアウトすることができ、[この](http://stackoverflow.com/a/40395995/2795592)と[この](http://stackoverflow.com/a/40036807/2795592)。 –

答えて

1

回答:

は、通常は​​変数を使用したい - それはあなたがインベントリにホスト名として使用するものです。
servers[ansible_hostname]ansible_hostnameの値を持つ servers 'のキーにアクセスします。

好奇心のために、this(複合フィルターチェーン)とthis(実行時オブジェクトの構成)をチェックアウトすることができます。