黑帽联盟

 找回密码
 会员注册
查看: 1056|回复: 0
打印 上一主题 下一主题

[基础服务] ansible笔记(33):过滤器(三)

[复制链接]
yun 黑帽联盟官方人员 

920

主题

37

听众

1364

积分

超级版主

Rank: 8Rank: 8

  • TA的每日心情
    奋斗
    2019-10-18 11:20
  • 签到天数: 678 天

    [LV.9]以坛为家II

    本帖最后由 yun 于 2019-9-11 17:16 编辑

    ansible是一个系列文章,我们会尽量以通俗易懂的方式总结ansible的相关知识点。
    ansible系列博文直达链接:ansible轻松入门系列
    "ansible系列"中的每篇文章都建立在前文的基础之上,所以,请按照顺序阅读这些文章,否则有可能在阅读中遇到障碍。


    话接前文,我们继续来总结一些常用的过滤器。
    1. ---
    2. - hosts: test70
    3.   remote_user: root
    4.   gather_facts: no
    5.   tasks:
    6.   ######################################################################
    7.   #在调用shell模块时,如果引用某些变量时需要添加引号,则可以使用quote过滤器代替引号
    8.   #示例如下,先看示例,后面会有注解
    9.   - shell: "echo {{teststr | quote}} > /testdir/testfile"
    10.     vars:
    11.       teststr: "a\nb\nc"
    12.   #上例中shell模块的写法与如下写法完全等效
    13.   #shell: "echo '{{teststr}}' > /testdir/testfile"
    14.   #没错,如你所见,quote过滤器能够代替引号
    15.   #上例中,如果不对{{teststr}}添加引号,则会报错,因为teststr变量中包含"\n"转义符
    16.   ######################################################################
    17.   #ternary过滤器可以实现三元运算的效果 示例如下
    18.   #如下示例表示如果name变量的值是John,那么对应的值则为Mr,否则则为Ms
    19.   #简便的实现类似if else对变量赋值的效果
    20.   - debug:
    21.       msg: "{{ (name == 'John') | ternary('Mr','Ms') }}"
    22.     vars:
    23.       name: "John"
    24.   ######################################################################
    25.   #basename过滤器可以获取到一个路径字符串中的文件名
    26.   - debug:
    27.       msg: "{{teststr | basename}}"
    28.     vars:
    29.       teststr: "/testdir/ansible/testfile"
    30.   ######################################################################
    31.   #获取到一个windows路径字符串中的文件名,2.0版本以后的ansible可用
    32.   - debug:
    33.       msg: "{{teststr | win_basename}}"
    34.     vars:
    35.       teststr: 'D:\study\zsythink'
    36.   ######################################################################
    37.   #dirname过滤器可以获取到一个路径字符串中的路径名
    38.   - debug:
    39.       msg: "{{teststr | dirname}}"
    40.     vars:
    41.       teststr: "/testdir/ansible/testfile"
    42.   ######################################################################
    43.   #获取到一个windows路径字符串中的文件名,2.0版本以后的ansible可用
    44.   - debug:
    45.       msg: "{{teststr | win_dirname}}"
    46.     vars:
    47.       teststr: 'D:\study\zsythink'
    48.   ######################################################################
    49.   #将一个windows路径字符串中的盘符和路径分开,2.0版本以后的ansible可用
    50.   - debug:
    51.       msg: "{{teststr | win_splitdrive}}"
    52.     vars:
    53.       teststr: 'D:\study\zsythink'
    54.   #可以配合之前总结的过滤器一起使用,比如只获取到盘符,示例如下
    55.   #msg: "{{teststr | win_splitdrive | first}}"
    56.   #可以配合之前总结的过滤器一起使用,比如只获取到路径,示例如下
    57.   #msg: "{{teststr | win_splitdrive | last}}"
    58.   ######################################################################
    59.   #realpath过滤器可以获取软链接文件所指向的真正文件
    60.   - debug:
    61.       msg: "{{ path | realpath }}"
    62.     vars:
    63.       path: "/testdir/ansible/testsoft"
    64.   ######################################################################
    65.   #relpath过滤器可以获取到path对于“指定路径”来说的“相对路径”
    66.   - debug:
    67.       msg: "{{ path | relpath('/testdir/testdir') }}"
    68.     vars:
    69.       path: "/testdir/ansible"
    70.   ######################################################################
    71.   #splitext过滤器可以将带有文件名后缀的路径从“.后缀”部分分开
    72.   - debug:
    73.       msg: "{{ path | splitext }}"
    74.     vars:
    75.       path: "/etc/nginx/conf.d/test.conf"
    76.   #可以配置之前总结的过滤器,获取到文件后缀
    77.   #msg: "{{ path | splitext | last}}"
    78.   #可以配置之前总结的过滤器,获取到文件前缀名
    79.   #msg: "{{ path | splitext | first | basename}}"
    80.   ######################################################################
    81.   #to_uuid过滤器能够为对应的字符串生成uuid
    82.   - debug:
    83.       msg: "{{ teststr | to_uuid }}"
    84.     vars:
    85.       teststr: "This is a test statement"
    86.   ######################################################################
    87.   #bool过滤器可以根据字符串的内容返回bool值true或者false
    88.   #字符串的内容为yes、1、True、true则返回布尔值true,字符串内容为其他内容则返回false
    89.   - debug:
    90.       msg: "{{ teststr | bool }}"
    91.     vars:
    92.       teststr: "1"
    93.   #当和用户交互时,有可能需要用户从两个选项中选择一个,比如是否继续,
    94.   #这时,将用户输入的字符串通过bool过滤器处理后得出布尔值,从而进行判断,比如如下用法
    95.   #- debug:
    96.   #    msg: "output when bool is true"
    97.   #  when: some_string_user_input | bool
    98.   ######################################################################
    99.   #map过滤器可以从列表中获取到每个元素所共有的某个属性的值,并将这些值组成一个列表
    100.   #当列表中嵌套了列表,不能越级获取属性的值,也就是说只能获取直接子元素的共有属性值。
    101.   - vars:
    102.       users:
    103.       - name: tom
    104.         age: 18
    105.         hobby:
    106.         - Skateboard
    107.         - VideoGame
    108.       - name: jerry
    109.         age: 20
    110.         hobby:
    111.         - Music
    112.     debug:
    113.       msg: "{{ users | map(attribute='name') | list }}"
    114.   #也可以组成一个字符串,用指定的字符隔开,比如分号
    115.   #msg: "{{ users | map(attribute='name') | join(';') }}"
    116.   ######################################################################
    117.   #与python中的用法相同,两个日期类型相减能够算出两个日期间的时间差
    118.   #下例中,我们使用to_datatime过滤器将字符串类型转换成了日期了类型,并且算出了时间差
    119.   - debug:
    120.       msg: '{{ ("2016-08-14 20:00:12"| to_datetime) - ("2012-12-25 19:00:00" | to_datetime) }}'
    121.   #默认情况下,to_datatime转换的字符串的格式必须是“%Y-%m-%d %H:%M:%S”
    122.   #如果对应的字符串不是这种格式,则需要在to_datetime中指定与字符串相同的时间格式,才能正确的转换为时间类型
    123.   - debug:
    124.       msg: '{{ ("20160814"| to_datetime("%Y%m%d")) - ("2012-12-25 19:00:00" | to_datetime) }}'
    125.   #如下方法可以获取到两个日期之间一共相差多少秒
    126.   - debug:
    127.       msg: '{{ ( ("20160814"| to_datetime("%Y%m%d")) - ("20121225" | to_datetime("%Y%m%d")) ).total_seconds() }}'
    128.   #如下方法可以获取到两个日期“时间位”相差多少秒,注意:日期位不会纳入对比计算范围
    129.   #也就是说,下例中的2016-08-14和2012-12-25不会纳入计算范围
    130.   #只是计算20:00:12与08:30:00相差多少秒
    131.   #如果想要算出连带日期的秒数差则使用total_seconds()
    132.   - debug:
    133.       msg: '{{ ( ("2016-08-14 20:00:12"| to_datetime) - ("2012-12-25 08:30:00" | to_datetime) ).seconds }}'
    134.   #如下方法可以获取到两个日期“日期位”相差多少天,注意:时间位不会纳入对比计算范围
    135.   - debug:
    136.       msg: '{{ ( ("2016-08-14 20:00:12"| to_datetime) - ("2012-12-25 08:30:00" | to_datetime) ).days }}'
    137.   ######################################################################
    138.   #使用base64编码方式对字符串进行编码
    139.   - debug:
    140.       msg: "{{ 'hello' | b64encode }}"
    141.   #使用base64编码方式对字符串进行解码
    142.   - debug:
    143.       msg: "{{ 'aGVsbG8=' | b64decode }}"
    144.   #######################################################################
    145.   #使用sha1算法对字符串进行哈希
    146.   - debug:
    147.       msg: "{{ '123456' | hash('sha1') }}"
    148.   #使用md5算法对字符串进行哈希
    149.   - debug:
    150.       msg: "{{ '123456' | hash('md5') }}"
    151.   #获取到字符串的校验和,与md5哈希值一致
    152.   - debug:
    153.       msg: "{{ '123456' | checksum }}"
    154.   #使用blowfish算法对字符串进行哈希,注:部分系统支持
    155.   - debug:
    156.       msg: "{{ '123456' | hash('blowfish') }}"
    157.   #使用sha256算法对字符串进行哈希,哈希过程中会生成随机"盐",以便无法直接对比出原值
    158.   - debug:
    159.       msg: "{{ '123456' | password_hash('sha256') }}"
    160.   #使用sha256算法对字符串进行哈希,并使用指定的字符串作为"盐"
    161.   - debug:
    162.       msg: "{{ '123456' | password_hash('sha256','mysalt') }}"
    163.   #使用sha512算法对字符串进行哈希,哈希过程中会生成随机"盐",以便无法直接对比出原值
    164.   - debug:
    165.       msg: "{{ '123123' | password_hash('sha512') }}"
    166.   #使用sha512算法对字符串进行哈希,并使用指定的字符串作为"盐"
    167.   - debug:
    168.       msg: "{{ '123123' | password_hash('sha512','ebzL.U5cjaHe55KK') }}"
    169.   #如下方法可以幂等的为每个主机的密码生成对应哈希串
    170.   #有了之前总结的过滤器用法作为基础,你一定已经看懂了
    171.   - debug:
    172.       msg: "{{ '123123' | password_hash('sha512', 65534|random(seed=inventory_hostname)|string) }}"
    复制代码

    这篇文章就总结到这里,快动手实践一下吧~


    帖子永久地址: 

    黑帽联盟 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与黑帽联盟享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和黑帽联盟的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、黑帽联盟管理员和版主有权不事先通知发贴者而删除本文

    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部