黑帽联盟

标题: ansible笔记(33):过滤器(三) [打印本页]

作者: yun    时间: 2019-9-10 13:25
标题: ansible笔记(33):过滤器(三)
本帖最后由 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) }}"
复制代码

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







欢迎光临 黑帽联盟 (https://bbs.cnblackhat.com/) Powered by Discuz! X2.5