diff options
author | Brian Coca <brian.coca+git@gmail.com> | 2014-12-16 17:47:50 -0500 |
---|---|---|
committer | Brian Coca <brian.coca+git@gmail.com> | 2014-12-16 17:47:50 -0500 |
commit | 7a43d4005026234cc8227147387d4782e2289d9e (patch) | |
tree | 7979b9e66a03f12d38e79bb2e5c957f978e1d46b | |
parent | fbadcfd44fb86752abd19616cb56acb25b89cae4 (diff) | |
download | ansible-7a43d4005026234cc8227147387d4782e2289d9e.tar.gz |
math filters!
-rw-r--r-- | docsite/rst/playbooks_variables.rst | 39 | ||||
-rw-r--r-- | lib/ansible/runner/filter_plugins/math.py | 96 |
2 files changed, 135 insertions, 0 deletions
diff --git a/docsite/rst/playbooks_variables.rst b/docsite/rst/playbooks_variables.rst index 3a52261360..e42fdce22d 100644 --- a/docsite/rst/playbooks_variables.rst +++ b/docsite/rst/playbooks_variables.rst @@ -310,6 +310,45 @@ To get a random list from an existing list:: {{ ['a','b','c']|shuffle }} => ['b','c','a'] note that when used with a non 'listable' item it is a noop, otherwise it always returns a list +j + +.. _math_stuff: + +Math +-------------------- +.. versionadded:: 1.9 + +To get the absolute value of a number:: + + {{ -23 | abs }} + +To see if something is actually a number:: + + {{ myvar | isnan }} + +Rounding:: + + {{ myvar | ceil }} + {{ myvar | floor }} + +Get the logarithm (default is e):: + + {{ myvar | log }} + +Get the base 10 logarithm:: + + {{ myvar | log(10) }} + +Give me the power of 2! (or 5):: + + {{ myvar | pow(2) }} + {{ myvar | pow(5) }} + +Square root, or the 5th:: + + {{ myvar | root }} + {{ myvar | root(5) }} + .. _other_useful_filters: diff --git a/lib/ansible/runner/filter_plugins/math.py b/lib/ansible/runner/filter_plugins/math.py new file mode 100644 index 0000000000..f49635af72 --- /dev/null +++ b/lib/ansible/runner/filter_plugins/math.py @@ -0,0 +1,96 @@ +# (c) 2014, Brian Coca <bcoca@ansible.com> +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see <http://www.gnu.org/licenses/>. + +import math +from ansible import errors + +def absolute(x): + + if isinstance(x, float): + return math.fabs(x) + elif isinstance(x, int): + return abs(x) + else + raise errors.AnsibleFilterError('abs() can only be used on numbers') + + +def cieling(x): + try: + return math.ciel(x) + except TypeError, e: + raise errors.AnsibleFilterError('ciel() can only be used on floats: %s' % str(e)) + + +def flooring(x): + try: + return math.floor(x) + except TypeError, e: + raise errors.AnsibleFilterError('floor() can only be used on floats: %s' % str(e)) + + +def isnotanumber(x): + try: + return math.isnan(x) + except TypeError, e: + return False + + +def logarithm(x, base=math.e): + try: + if base == 10: + return math.log10(x) + else: + return = math.log(x, base) + except TypeError, e: + raise errors.AnsibleFilterError('log() can only be used on numbers: %s' % str(e)) + + +def power(x): + try: + return math.pow(x,y) + except TypeError, e: + raise errors.AnsibleFilterError('pow() can only be used on numbers: %s' % str(e)) + + +def inversepower(x, base=2): + try: + if base == 2: + return math.sqrt(x) + else: + return math.pow(x, 1.0/float(base)) + except TypeError, e: + raise errors.AnsibleFilterError('root() can only be used on numbers: %s' % str(e)) + + +class FilterModule(object): + ''' Ansible math jinja2 filters ''' + + def filters(self): + return { + # general math + 'abs': absolute, + 'isnan': isnotanumber, + + # rounding + 'ceil': cieling, + 'floor': flooring, + + # exponents and logarithms + 'log': logarithm, + 'pow': power, + 'root': inversepower, + } |