十、ansible中的过滤器

      

目录

一、跟字符串有关的过滤器

二、跟数字有关的过滤器

三、列表操作相关的过滤器

四、变量未定义时相关操作的过滤器

五、dict2items过滤器


  过滤器是一种能够帮助我们处理数据的工具,当我们想要通过过滤器处理数据时,只需要将数据通过管道符传递给对应的过滤器即可,

示例:将变量的值,都转换成大写字母

---
- hosts: web
  remote_user: root

  vars:
    test: asd42f1

  tasks:
  - name: test filterate
    debug:
      msg: "{{ test | upper }}"
[root@k8s-master-1 filterate]# ansible-playbook -C gl1.yaml
ok: [192.168.134.138] => {
    "msg": "ASD42F1"
}

过滤器

说明

upper

转换成大写

lower

转换成小写

length

返回字符串长度

round

四舍五入

random

返回随机数

max、min

最大值、最小值

sort、

升序

sort(reverse=true)

降序

sum

求和

join(',')

合并成一个字符串,每个元素之间用指定的字符隔开

unique

去重

default('asd')

默认值:abc

default(omit)

可有可无

一、跟字符串有关的过滤器

---
- hosts: web
  remote_user: root

  vars:
    test1: abc123ABC 678
    test2: " ad "
    

  tasks:
  - name: "将字符串转换成大写"
    debug:
      msg: "{{test1 | upper }}"
  - name: "将字符串转换成小写"
    debug:
      msg: "{{test1 | lower }}"

  - name: "将字符串变成首字母大写,之后所有字母小写"
    debug:
      msg: "{{test1 | capitalize }}"

  - name: "将字符串反转"
    debug:
      msg: "{{test1 | reverse }}"

  - name: "返回字符串的第一个字符"
    debug:
      msg: "{{test1 | first }}"

  - name: "返回字符串最后一个字符"
    debug:
      msg: "{{test1 | last }}"

  - name: "将字符串的开头和结尾空格去除"
    debug:
      msg: "{{test2 | trim }}"

  - name: "返回字符串的长度"
    debug:
      msg: "{{test1 | length }}"

  - name: "将字符串转换成列表,每个字符作为一个元素"
    debug:
      msg: "{{test1 | list }}"
[root@k8s-master-1 filterate]# ansible-playbook  gl2.yaml 

TASK [将字符串转换成大写] *************************************************************************
ok: [192.168.134.138] => {
    "msg": "ABC123ABC 678"
}

TASK [将字符串转换成小写] *************************************************************************
ok: [192.168.134.138] => {
    "msg": "abc123abc 678"
}

TASK [将字符串变成首字母大写,之后所有字母小写] *********************************
ok: [192.168.134.138] => {
    "msg": "Abc123abc 678"
}

TASK [将字符串反转] ***********************************************************************************
ok: [192.168.134.138] => {
    "msg": "876 CBA321cba"
}

TASK [返回字符串的第一个字符] ***********************************************************************************
ok: [192.168.134.138] => {
    "msg": "a"
}

TASK [返回字符串最后一个字符] ******************************************************************************
ok: [192.168.134.138] => {
    "msg": "8"
}

TASK [将字符串的开头和结尾空格去除] *****************************************************************************************
ok: [192.168.134.138] => {
    "msg": "ad"
}

TASK [返回字符串的长度] *********************************************************************************************
ok: [192.168.134.138] => {
    "msg": "13"
}

TASK [将字符串转换成列表,每个字符作为一个元素] ***********************************************************
ok: [192.168.134.138] => {
    "msg": [
        "a", 
        "b", 
        "c", 
        "1", 
        "2", 
        "3", 
        "A", 
        "B", 
        "C", 
        " ", 
        "6", 
        "7", 
        "8"
    ]
}

二、跟数字有关的过滤器

---
- hosts: web
  remote_user: root

  vars:
    test: -1

  tasks:
    # ansible中,字符串和整形不能直接计算,比如{{8 + ‘8’}}会报错,所以,必须将字符串转换成整形之后才能计算
  - name: "将对应的值转换成int类型"
    debug:
      msg: "{{8 + '8' | int }}"

  - name: "将对应的值转换成int类型,如果无法转换,默认返回0"
    debug:
      # 使用int(default=6)或者int(6)时,如果无法转换则返回指定值6
      msg: "{{ 'a' | int(default=6) }}"
  - name: "对应的值转换成浮点型,如果无法转换,默认返回'0.0'"
    debug:
      msg: "{{ '8' | float }}"

  - name: "当对应的值无法被转换成浮点型时,则返回指定值’8.88‘"
    debug:
      msg: "{{ 'a' | float(8.88) }}"

  - name: "获取对应数值的绝对值"
    debug:
      msg: "{{ test | abs }}"

  - name: "四舍五入"
    debug:
      msg: "{{ 12.5 | round }}"

  - name: "取小数点后五位"
    debug:
      msg: "{{ 3.1415926 | round(5) }}"

  - name: "从0到100中随机返回一个随机数"
    debug:
      msg: "{{ 100 | random }}"

  - name: "从5到10中随机返回一个随机数"
    debug:
      msg: "{{ 10 | random(start=5) }}"

  - name: "从5到15中随机返回一个随机数,步长为3,长为3的意思是返回的随机数只有可能是5、8、11、14中的一个"
    debug:
      msg: "{{ 15 | random(start=5,step=3) }}"

  - name: "从0到15中随机返回一个随机数,这个随机数是5的倍数"
    debug:
      msg: "{{ 15 | random(step=5) }}"
[root@k8s-master-1 filterate]# ansible-playbook -C gl3.yaml
TASK [将对应的值转换成int类型] **************************************************************************
ok: [192.168.134.138] => {
    "msg": "16"
}

TASK [将对应的值转换成int类型,如果无法转换,默认返回6] ****************************
ok: [192.168.134.138] => {
    "msg": "6"
}

TASK [对应的值转换成浮点型,如果无法转换,默认返回'0.0'] *************************
ok: [192.168.134.138] => {
    "msg": "8.0"
}

TASK [当对应的值无法被转换成浮点型时,则返回指定值’8.88‘] *************************
ok: [192.168.134.138] => {
    "msg": "8.88"
}

TASK [获取对应数值的绝对值] ************************************
ok: [192.168.134.138] => {
    "msg": "1"
}

TASK [四舍五入] ********************************************************************************
ok: [192.168.134.138] => {
    "msg": "13.0"
}

TASK [取小数点后五位] *****************************************************************************
ok: [192.168.134.138] => {
    "msg": "3.14159"
}

TASK [从0到100中随机返回一个随机数] *****************************************************************
ok: [192.168.134.138] => {
    "msg": "94"
}

TASK [从5到10中随机返回一个随机数] *************************************************************
ok: [192.168.134.138] => {
    "msg": "7"
}

TASK [从5到15中随机返回一个随机数,步长为3,长为3的意思是返回的随机数只有可能是5、8、11、14中的一个] ***
ok: [192.168.134.138] => {
    "msg": "5"
}

TASK [从0到15中随机返回一个随机数,这个随机数是5的倍数] *************
ok: [192.168.134.138] => {
    "msg": "5"
}

三、列表操作相关的过滤器

---
- hosts: web
  remote_user: root

  vars:
    testvar7: [22,18,5,33,27,30]
    testvar8: [1,[7,2,[15,9]],3,5]
    testvar9: [1,'b',5]
    testvar10: [1,'A','b',['QQ','wechat'],'CdEf']
    testvar11: ['abc',1,3,'a',3,'1','abc']
    testvar12: ['abc',2,'a','b','a']

  tasks:

  - name: "返回列表长度"
    debug:
      msg: "{{ testvar7 | length }}"

  - name: "返回列表中第一个值"
    debug:
      msg: "{{ testvar7 | first }}"

  - name: "返回列表中最后一个值"
    debug:
      msg: "{{ testvar7 | last }}"

  - name: "返回列表最大值"
    debug:
      msg: "{{ testvar7 | max}}"

  - name: "返回列表最小值"
    debug:
      msg: "{{ testvar7 | min }}"

  - name: "将列表升序输出"
    debug:
      msg: "{{ testvar7 | sort }}"

  - name: "将列表降序排序输出"
    debug:
      msg: "{{ testvar7 | sort(reverse=true) }}"

  - name: "返回纯数字非嵌套列表的和"
    debug:
      msg: "{{ testvar7 | sum }}"

  - name: "如果列表中包含列表,那么使用flatten可以'拉平'嵌套的列表"
    debug:
      msg: "{{ testvar8 | flatten }}"

  - name: "如果列表中嵌套了列表,那么将第1层的嵌套列表‘拉平’"
    debug:
      msg: "{{ testvar8 | flatten(levels=1) }}"

  - name: "取出嵌套列表中的最大值"
    debug:
      msg: "{{ testvar8 | flatten | max }}"

  - name: "将列表中的元素合并成一个字符串"
    debug:
      msg: "{{ testvar9 | join }}"

  - name: "将列表中的元素合并成一个字符串,每个元素之间用指定的字符隔开"
    debug:
      msg: "{{ testvar9 | join(' , ') }}"
      

  - name: "从列表中随机返回一个元素"
    debug:
      #对列表使用random过滤器时,不能使用start和step参数
      msg: "{{ testvar9 | random }}"

  - name: "随机打乱顺序列表中元素的顺序"
    debug:
      #shuffle的字面意思为洗牌
      msg: "{{ testvar9 | shuffle }}"

  - name: "随机打乱顺序时,将ansible_date_time.epoch的值设置为随机种子"
    debug:
      #随机打乱顺序列表中元素的顺序
      #在随机打乱顺序时,将ansible_date_time.epoch的值设置为随机种子
      #seed参数从ansible2.3版本开始可用
      msg: "{{ testvar9 | shuffle(seed=(ansible_date_time.epoch)) }}"

  - name: "去掉列表中重复的元素,重复的元素只留下一个"
    debug:
      msg: "{{ testvar11 | unique }}"

  - name: "将两个列表合并,重复的元素只留下一个"
    debug:
      #也就是求两个列表的并集
      msg: "{{ testvar11 | union(testvar12) }}"

  - name: "取出两个列表的交集,重复的元素只留下一个"
    debug:
      msg: "{{ testvar11 | intersect(testvar12) }}"


  - debug:
      #取出存在于testvar11列表中,但是不存在于testvar12列表中的元素
      #去重后重复的元素只留下一个
      #换句话说就是:两个列表的交集在列表1中的补集
      msg: "{{ testvar11 | difference(testvar12) }}"
  - debug:
      #取出两个列表中各自独有的元素,重复的元素只留下一个
      #即去除两个列表的交集,剩余的元素
      msg: "{{ testvar11 | symmetric_difference(testvar12) }}"
[root@k8s-master-1 filterate]# ansible-playbook -C gl4.yaml 


TASK [返回列表长度] ******************************
ok: [192.168.134.138] => {
    "msg": "6"
}

TASK [返回列表中第一个值] **************************
ok: [192.168.134.138] => {
    "msg": "22"
}

TASK [返回列表中最后一个值] **************************
ok: [192.168.134.138] => {
    "msg": "30"
}

TASK [返回列表最大值] **********************************
ok: [192.168.134.138] => {
    "msg": "33"
}

TASK [返回列表最小值] *********************************
ok: [192.168.134.138] => {
    "msg": "5"
}

TASK [将列表升序输出] *******************************
ok: [192.168.134.138] => {
    "msg": [
        5, 
        18, 
        22, 
        27, 
        30, 
        33
    ]
}

TASK [将列表降序排序输出] ************************
ok: [192.168.134.138] => {
    "msg": [
        33, 
        30, 
        27, 
        22, 
        18, 
        5
    ]
}

TASK [返回纯数字非嵌套列表的和] ***************************************
ok: [192.168.134.138] => {
    "msg": "135"
}

TASK [如果列表中包含列表,那么使用flatten可以'拉平'嵌套的列表] ******************
ok: [192.168.134.138] => {
    "msg": [
        1, 
        7, 
        2, 
        15, 
        9, 
        3, 
        5
    ]
}

TASK [如果列表中嵌套了列表,那么将第1层的嵌套列表‘拉平’] ****************************
ok: [192.168.134.138] => {
    "msg": [
        1, 
        7, 
        2, 
        [
            15, 
            9
        ], 
        3, 
        5
    ]
}

TASK [取出嵌套列表中的最大值] *******************
ok: [192.168.134.138] => {
    "msg": "15"
}

TASK [将列表中的元素合并成一个字符串] *******************
ok: [192.168.134.138] => {
    "msg": "1b5"
}

TASK [将列表中的元素合并成一个字符串,每个元素之间用指定的字符隔开] *******
ok: [192.168.134.138] => {
    "msg": "1 , b , 5"
}

TASK [从列表中随机返回一个元素] ************************
ok: [192.168.134.138] => {
    "msg": "b"
}

TASK [随机打乱顺序列表中元素的顺序] **************************
ok: [192.168.134.138] => {
    "msg": [
        "b", 
        5, 
        1
    ]
}

TASK [随机打乱顺序时,将ansible_date_time.epoch的值设置为随机种子] *******
ok: [192.168.134.138] => {
    "msg": [
        "b", 
        5, 
        1
    ]
}

TASK [去掉列表中重复的元素,重复的元素只留下一个] ******************
ok: [192.168.134.138] => {
    "msg": [
        "abc", 
        1, 
        3, 
        "a", 
        "1"
    ]
}

TASK [将两个列表合并,重复的元素只留下一个] ***************
ok: [192.168.134.138] => {
    "msg": [
        "abc", 
        1, 
        3, 
        "a", 
        "1", 
        2, 
        "b"
    ]
}

TASK [取出两个列表的交集,重复的元素只留下一个] ***
ok: [192.168.134.138] => {
    "msg": [
        "abc", 
        "a"
    ]
}

TASK [debug] *********************
ok: [192.168.134.138] => {
    "msg": [
        1, 
        3, 
        "1"
    ]
}

TASK [debug] **********************
ok: [192.168.134.138] => {
    "msg": [
        1, 
        3, 
        "1", 
        2, 
        "b"
    ]
}

四、变量未定义时相关操作的过滤器

使用default 定义默认值

示例

# 在实际工作中,可能有几十个文件需要被创建,这些文件中,有些文件需要特定的权限,有些不需要,所以,我们可能需要使用循环来处理这个问题,但是在使用循环时,我们会遇到另一个问题,问题就是,有的文件有mode属性,有的文件没有mode属性,那么,我们就需要对文件是否有mode属性进行判断,
---
- hosts: web
  remote_user: root

  vars:
    paths:
    - path: /tmp/test
      mode: '0444'
    - path: /tmp/foo
    - path: /tmp/bar
  tasks:
  - file: dest="{{item.path}}" state=touch mode="{{item.mode | default(omit)}}"
    loop: "{{ paths }}"
# 上例中,我们并没有对文件是否有mode属性进行判断,而是直接调用了file模块的mode参数,将mode参数的值设定为了"{{item.mode | default(omit)}}",它的意思是,如果item有mode属性,就把file模块的mode参数的值设置为item的mode属性的值,如果item没有mode属性,file模块就直接省略mode参数,'omit’的字面意思就是"省略",也就是说:[有就用,没有就不用,可以有,也可以没有]。

五、dict2items过滤器

dict2items过滤器是在2.6版本中新加入的过滤器,它可以把一个字典格式的数据进行转换处理,具体会进行怎样的转换处理

users是一个字典格式的变量,它的结构是这样的
    users:
      alice: female
      bob: male
当users字典被dict2items转换处理以后,会变成如下模样
    users:
    - key: alice
      value: female
    - key: bob
      value: male

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁华依在

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值