summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Coca <brian.coca+git@gmail.com>2014-12-16 17:47:50 -0500
committerBrian Coca <brian.coca+git@gmail.com>2014-12-16 17:47:50 -0500
commit7a43d4005026234cc8227147387d4782e2289d9e (patch)
tree7979b9e66a03f12d38e79bb2e5c957f978e1d46b
parentfbadcfd44fb86752abd19616cb56acb25b89cae4 (diff)
downloadansible-7a43d4005026234cc8227147387d4782e2289d9e.tar.gz
math filters!
-rw-r--r--docsite/rst/playbooks_variables.rst39
-rw-r--r--lib/ansible/runner/filter_plugins/math.py96
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,
+ }