目录
过滤器是一种能够帮助我们处理数据的工具,当我们想要通过过滤器处理数据时,只需要将数据通过管道符传递给对应的过滤器即可,
示例:将变量的值,都转换成大写字母
---
- 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