diff --git a/docs/docsite/rst/playbooks_filters.rst b/docs/docsite/rst/playbooks_filters.rst index 1117bb2c05..be8564aa98 100644 --- a/docs/docsite/rst/playbooks_filters.rst +++ b/docs/docsite/rst/playbooks_filters.rst @@ -609,6 +609,41 @@ To get date object from string use the `to_datetime` filter, (new in version in # get amount of seconds between two dates, default date format is %Y-%d-%m %H:%M:%S but you can pass your own one {{ (("2016-08-04 20:00:12"|to_datetime) - ("2015-10-06"|to_datetime('%Y-%d-%m'))).seconds }} + +Combination Filters +```````````````````` + +.. versionadded:: 2.3 + +This set of filters returns a list of combined lists. +To get permutations of a list:: + + - name: give me largest permutations (order matters) + debug: msg="{{ [1,2,3,4,5]|permutations|list }}" + + - name: give me permutations of sets of 3 + debug: msg="{{ [1,2,3,4,5]|permutations(3)|list }}" + +Combinations always require a set size:: + + - name: give me combinations for sets of 2 + debug: msg="{{ [1,2,3,4,5]|combinations(2)|list }}" + + +To get a list combining the elements of other lists use ``zip``:: + + - name: give me list combo of 2 lists + debug: msg="{{ [1,2,3,4,5]|zip(['a','b','c','d','e','f'])|list }}" + + - name: give me shortest combo of 2 lists + debug: msg="{{ [1,2,3]|zip(['a','b','c','d','e','f'])|list }}" + +To always exhaust all list use ``zip_longest``:: + + - name: give me longest combo of 3 lists , fill with X + debug: msg="{{ [1,2,3]|zip_longest(['a','b','c','d','e','f'], [21, 22, 23], fillvalue='X')|list }}" + + Debugging Filters ````````````````` diff --git a/lib/ansible/plugins/filter/mathstuff.py b/lib/ansible/plugins/filter/mathstuff.py index a1b4ade78a..242549f348 100644 --- a/lib/ansible/plugins/filter/mathstuff.py +++ b/lib/ansible/plugins/filter/mathstuff.py @@ -22,9 +22,12 @@ __metaclass__ = type import math import collections +import itertools + from ansible import errors from ansible.module_utils import basic + def unique(a): if isinstance(a,collections.Hashable): c = set(a) @@ -117,7 +120,7 @@ class FilterModule(object): ''' Ansible math jinja2 filters ''' def filters(self): - return { + filters = { # general math 'min' : min, 'max' : max, @@ -134,8 +137,25 @@ class FilterModule(object): 'symmetric_difference': symmetric_difference, 'union': union, + # combinatorial + 'permutations': itertools.permutations, + 'combinations': itertools.combinations, + # computer theory 'human_readable' : human_readable, 'human_to_bytes' : human_to_bytes, } + + # py2 vs py3, reverse when py3 is predominant version + try: + filters['zip'] = itertools.izip + filters['zip_longest'] = itertools.izip_longest + except AttributeError: + try: + filters['zip'] = itertools.zip + filters['zip_longest'] = itertools.zip_longest + except: + pass + + return filters