ansible的Filter
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: 获取列表的第一个元素和最后一个元素
sort 可以对可迭代对象进行排序,类似列表 sort(value, reverse=False, case_sensitive=False, attribute=None) - name: find find: paths: /etc/nova patterns: 'nova.conf.*' register: find_out - debug: var=(find_out.files|sort(attribute='mtime')|last).path 此示例 根据查找/etc/nova/中 nova.conf.*的文件,然后根据mtime进行排序,最后抓出last元素的path值