FILTERS = {
'attr': do_attr,
'replace': do_replace,
'upper': do_upper,
'lower': do_lower,
'escape': escape,
'e': escape,
'forceescape': do_forceescape,
'capitalize': do_capitalize,
'title': do_title,
'default': do_default,
'd': do_default,
'join': do_join,
'count': len,
'dictsort': do_dictsort,
'sort': do_sort,
'length': len,
'reverse': do_reverse,
'center': do_center,
'indent': do_indent,
'title': do_title,
'capitalize': do_capitalize,
'first': do_first,
'last': do_last,
'map': do_map,
'random': do_random,
'reject': do_reject,
'rejectattr': do_rejectattr,
'filesizeformat': do_filesizeformat,
'pprint': do_pprint,
'truncate': do_truncate,
'wordwrap': do_wordwrap,
'wordcount': do_wordcount,
'int': do_int,
'float': do_float,
'string': soft_unicode,
'list': do_list,
'urlize': do_urlize,
'format': do_format,
'trim': do_trim,
'striptags': do_striptags,
'select': do_select,
'selectattr': do_selectattr,
'slice': do_slice,
'batch': do_batch,
'sum': do_sum,
'abs': abs,
'round': do_round,
'groupby': do_groupby,
'safe': do_mark_safe,
'xmlattr': do_xmlattr,
'urlencode': do_urlencode
}
自定义过滤器:http://blog.51cto.com/rfyiamcool/1440686
filter的格式: value..| filter() 在python中就是类的实例化 filter(self,*args,**kwargs) self就是filter中管道符前的value。
本文基于ansible 2.4.2.0版本
core.py中核心过滤器
# jinja2 overrides
'groupby': do_groupby,
# base 64
'b64decode': b64decode,
'b64encode': b64encode,
# uuid
'to_uuid': to_uuid,
# json
'to_json': to_json,
'to_nice_json': to_nice_json,
'from_json': json.loads,
# yaml
'to_yaml': to_yaml,
'to_nice_yaml': to_nice_yaml,
'from_yaml': from_yaml,
# date
'to_datetime': to_datetime,
# path
'basename': partial(unicode_wrap, os.path.basename),
'dirname': partial(unicode_wrap, os.path.dirname),
'expanduser': partial(unicode_wrap, os.path.expanduser),
'realpath': partial(unicode_wrap, os.path.realpath),
'relpath': partial(unicode_wrap, os.path.relpath),
'splitext': partial(unicode_wrap, os.path.splitext),
'win_basename': partial(unicode_wrap, ntpath.basename),
'win_dirname': partial(unicode_wrap, ntpath.dirname),
'win_splitdrive': partial(unicode_wrap, ntpath.splitdrive),
# value as boolean
'bool': to_bool,
# date formating
'strftime': strftime,
# quote string for shell usage
'quote': quote,
# hash filters
# md5 hex digest of string
'md5': md5s,
# sha1 hex digeset of string
'sha1': checksum_s,
# checksum of string as used by ansible for checksumming files
'checksum': checksum_s,
# generic hashing
'password_hash': get_encrypted_password,
'hash': get_hash,
# file glob
'fileglob': fileglob,
# regex
'regex_replace': regex_replace,
'regex_escape': regex_escape,
'regex_search': regex_search,
'regex_findall': regex_findall,
# ? : ;
'ternary': ternary,
# list
# random stuff
'random': rand,
'shuffle': randomize_list,
# undefined
'mandatory': mandatory,
# merge dicts
'combine': combine,
# comment-style decoration
'comment': comment,
# array and dict lookups
'extract': extract,
# debug
'type_debug': lambda o: o.__class__.__name__,
ipaddr.py中的ip地址相关过滤器
# IP addresses and networks
'ipaddr': ipaddr,
'ipwrap': ipwrap,
'ip4_hex': ip4_hex,
'ipv4': ipv4,
'ipv6': ipv6,
'ipsubnet': ipsubnet,
'next_nth_usable': next_nth_usable,
'network_in_network': network_in_network,
'network_in_usable': network_in_usable,
'nthhost': nthhost,
'previous_nth_usable': previous_nth_usable,
'slaac': slaac,
# MAC / HW addresses
'hwaddr': hwaddr,
'macaddr': macaddr
json_query.py中json过滤器
'json_query': json_query
mathstuff.py中的数学运算相关的过滤器
# general math
'min': min,
'max': max,
# exponents and logarithms
'log': logarithm,
'pow': power,
'root': inversepower,
# set theory
'unique': unique,
'intersect': intersect,
'difference': difference,
'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,
# zip
'zip': zip,
'zip_longest': zip_longest,
network.py中网络相关的filter
'parse_cli': parse_cli,
'parse_cli_textfsm': parse_cli_textfsm
urlsplit.py中的url的filter
'urlsplit': split_url
jinjia2 的过滤器 ,路径/usr/lib/python2.7/site-packages/jinja2/filters.py
'attr': do_attr,
'replace': do_replace,
'upper': do_upper,
'lower': do_lower,
'escape': escape,
'e': escape,
'forceescape': do_forceescape,
'capitalize': do_capitalize,
'title': do_title,
'default': do_default,
'd': do_default,
'join': do_join,
'count': len,
'dictsort': do_dictsort,
'sort': do_sort,
'length': len,
'reverse': do_reverse,
'center': do_center,
'indent': do_indent,
'title': do_title,
'capitalize': do_capitalize,
'first': do_first,
'last': do_last,
'map': do_map,
'random': do_random,
'reject': do_reject,
'rejectattr': do_rejectattr,
'filesizeformat': do_filesizeformat,
'pprint': do_pprint,
'truncate': do_truncate,
'wordwrap': do_wordwrap,
'wordcount': do_wordcount,
'int': do_int,
'float': do_float,
'string': soft_unicode,
'list': do_list,
'urlize': do_urlize,
'format': do_format,
'trim': do_trim,
'striptags': do_striptags,
'select': do_select,
'selectattr': do_selectattr,
'slice': do_slice,
'batch': do_batch,
'sum': do_sum,
'abs': abs,
'round': do_round,
'groupby': do_groupby,
'safe': do_mark_safe,
'xmlattr': do_xmlattr,
'urlencode': do_urlencode
ternary(value,true_val,false_val): 传入三个值,如果value是true,则return true_val,否则return false_val。
def ternary(value, true_val, false_val):
''' value ? true_val : false_val '''
if bool(value):
return true_val
else:
return false_val
playbook示例
---
- name: ternary
hosts: localhost
tasks:
- name: set value
set_fact:
a: true
b: "if a true"
c: "if a false"
- name: debug
debug:
var: a|ternary(b,c)
...
################
脚本的执行
[root@node-1 filters_test]# ansible-playbook ternary_test.yml
PLAY [ternary] *********************************************************************************
TASK [set value] *******************************************************************************
ok: [localhost]
TASK [debug] ***********************************************************************************
ok: [localhost] => {
"a|ternary(b,c)": "if a true"
}
PLAY RECAP *************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed
strftime的当前时间的用法
def strftime(string_format, second=None):
''' return a date string using string. See https://docs.python.org/2/library/time.html#time.strftime for format '''
if second is not None:
try:
second = int(second)
except:
raise errors.AnsibleFilterError('Invalid value for epoch value (%s)' % second)
return time.strftime(string_format, time.localtime(second))
如果要用指定时间则strftime(second)
示例:
- name: get time
set_fact:
curtime: "{{ '%Y-%m-%d %H:%M:%S'|strftime }}"
select、map和type_debug的用法
select('funtion_name', 'regexp') function可以是filter,map,reduce等
value|type_debug 类似type(value)获取值的数据类型
---
- hosts: localhost
gather_facts: true
tasks:
- debug: msg="{{ ansible_interfaces|select('match','^eth|wlan[0-9]+')|list }}" # match、search、map获取的都是迭代器,需要list一下变成列表
- debug: msg="{{ ansible_interfaces|select('search','eth|wlan[0-9]+')|list }}"
- debug: msg="{{ ansible_interfaces|map('upper')|list }}" # map('func','args','arg2') map(attribute='key')
- debug: msg="{{ ansible_interfaces + [\"VETH-1\",\"VETH-2\"] }}" #列表的扩展方法之一 字符串也可以这么扩展
- debug: msg="{{ ansible_interfaces|type_debug }}"
##################################################################
PLAY [localhost] *******************************************************************************
TASK [Gathering Facts] *************************************************************************
ok: [localhost]
TASK [debug] ***********************************************************************************
ok: [localhost] => {}
MSG:
[u'eth1', u'eth0']
TASK [debug] ***********************************************************************************
ok: [localhost] => {}
MSG:
[u'eth1', u'eth0', u'br-eth1', u'br-eth0']
TASK [debug] ***********************************************************************************
ok: [localhost] => {}
MSG:
[u'BR-VXLAN', u'OVS-SYSTEM', u'BR-STORAGEPUB', u'BR-EX-HAPR', u'BR-MGMT-HAPR', u'ETH1', u'ETH0', u'BR-ETH1', u'LO', u'IFB0', u'VXLAN_SYS_4789', u'BR-ROLLER', u'BR-PRV', u'BR-TUN', u'BR-INT', u'BR-BM', u'TAP0', u'BR-IPMI', u'HAPR-HOST', u'BR-ETH0', u'BR-STORAGE', u'BR-MGMT', u'BR-EX']
TASK [debug] ***********************************************************************************
ok: [localhost] => {}
MSG:
[u'br-vxlan', u'ovs-system', u'br-storagepub', u'br-ex-hapr', u'br-mgmt-hapr', u'eth1', u'eth0', u'br-eth1', u'lo', u'ifb0', u'vxlan_sys_4789', u'br-roller', u'br-prv', u'br-tun', u'br-int', u'br-bm', u'tap0', u'br-ipmi', u'hapr-host', u'br-eth0', u'br-storage', u'br-mgmt', u'br-ex', u'VETH-1', u'VETH-2']
TASK [debug] ***********************************************************************************
ok: [localhost] => {}
MSG:
list
PLAY RECAP *************************************************************************************
localhost : ok=6 changed=0 unreachable=0 failed=0
first和last: 获取列表的第一个元素和最后一个元素
出处:https://www.cnblogs.com/wangl-blog/archive/2018/05/07/9002346.html