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值

 

posted @ 2018-05-07 14:11  ishmaelwanglin  阅读(3761)  评论(0编辑  收藏  举报