2016-03-25 7 views
2

私はこのようなリストを持ってansible/Jinja2の取得のユニークなサブ要素

host_depends: 
    - host: abc 
    depends: 
     - name: item1 
     - name: item4 
     type: asdf 
     - name: item6 
    - host: def 
    depends: 
     - name: item2 
     - name: item4 
     - name: item6 

この例では、私はループ

- item1 
- item2 
- item4 
- item6 

オーバーをしたいので、私は、 depends elemnentsのユニークな名前の上にループする必要があります

基本的に

debug: var=item.1.name 
with_subelements: 
    - "{{ host_depends }}" 
    - depends 

が何をするかが、唯一のユニークな要素を持ちます。私は彼らの上にuniqueフィルタを実行し、with_itemsでそれらを使用することができますので、私はすべてのhost_depends項目のdependsを取得できますか

編集:

私はこのようなすべてのdepends項目のリストを取得するために管理します。

host_depends|map(attribute='depends')|list 

をしかしそこから、私はname項目に、このリストを減少させることができません。

答えて

2

もし事があまりにも複雑になりすぎて、あなたの周りに心配することができないなら、それは行われてはならないという指標です。いくつかのJinjaフィルターといくつかのset_factタスクをループで使用することは可能でしょうか。しかし、しないでください、Ansibleはプログラミング言語ではないので、そのように使用すべきではありません。 Ansibleには、読みやすさと拡張性という2つの主な長所があります。後者を無視して最初のことを壊さないでください。

with_subelementsは実際にはプラグイン自体であり、コアプラグインであるということだけです。コピーして、独自のwith_unique_subelementsプラグインを作成してください。ここにはcode of with_subelementsがあります。行100は、要素が戻りリストに追加される場所です。その項目が既に追加されていれば、チェックインしてチェックを実装できます。

あなたのプレイブックに関連する修正版をlookup_plugins/unique_subelements.pyとして保存してください。また、Ansible 2を使用する場合は、任意の役割の中に同じパスで保存することもできます。

1

host_depends|map(attribute='depends')|listはリストのリストを返します。dependsはリストです。

roles/<rolename>/filter_plugins/filter.pyとしてこれを追加します:リストのこのリストは1つのリストに結合/平坦にする 依存として

from ansible import errors 

# This converts a list of lists into a single list 
def flattenlist(l): 
    try: 
     return [item for sublist in l for item in sublist] 
    except Exception, e: 
     raise errors.AnsibleFilterError('split plugin error: %s' % str(e)) 

class FilterModule(object): 
    ''' A filter to split a string into a list. ''' 
    def filters(self): 
     return { 
      'flattenlist' : flattenlist 
     } 

をそして

host_depends|map(attribute='depends')|flattenlist|map(attribute='name')|unique|list 
+0

どのように使いますか?あなたは 'with_subelements:'と一緒に使っていますか? – MaxU

+1

@MaxUいいえ、これはフラットなリストなので、 'with_items'を使ってアイテムを繰り返し処理します。 – Zulakis

2
host_depends|map(attribute='depends')|list 

を使用して、リストのリストをされて返しますリスト。このリストのリストを1つのリストにまとめるには、組み込みフラットルック検索を使用します。

lookup('flattened', host_depends|map(attribute='depends')) |map(attribute='name')|unique|list 
+1

面白い!私はこのルックアップがどこにでも書かれているのを見つけることができません。 – Zulakis

+0

[email protected]ハンドラを含むすべてがルックアップです –

関連する問題