[TOC]
常用过滤器一(filters) 描述:”过滤器(filters)”可以帮助我们对数据进行处理,ansible中的过滤器功能来自于jinja2模板引擎
,我们可以借助jinja2的过滤器功能在ansible中对数据进行各种处理;很多其他的过滤器有些是jinja2内置的有些是ansible特有,变量和过滤器之间采用类似于管道符进行拼接;
(1)字符串操作有关的过滤器:
upper 过滤器 : 将所有小写字母都被变成了大写
lower 过滤器 : 将所有大写字母都被变成了小写
capitalize 过滤器 : 将字符串变成首字母大写,之后所有字母纯小写
reverse 过滤器 : 将字符串反转
list 过滤器 : 将字符串转换成列表,每个字符作为一个元素
shuffle 过滤器 : 字面意思为洗牌,将字符串转换成列表每个字符作为一个元素,并且随机打乱顺序 #在随机打乱顺序时将ansible_date_time.epoch的值设置为随机种子
first 过滤器 : 返回字符串的第一个字符
last 过滤器 : 返回字符串的最后一个字符
length 过滤器 : 返回字符串长度,length与count等效,可以写为count
center(width=30) : 将字符串放在中间,并且设置字符串的长度默认以0补齐
(2)数字操作有关的过滤器
int,int(default=6) : 将对应的值转换成int类型,将对应的值转换成int类型,如果无法转换,默认返回0
float,float(8.88) : 将对应的值转换成浮点型,如果无法转换,默认返回’0.0’,当对应的值无法被转换成浮点型时,则返回指定值’8.8‘
abs : 获取对应数值的绝对值
round,round(5): 四舍五入或者取小数点后
random(seed=(ansible_date_time.epoch)),random(start=5),random(start=5,step=3): 随机返回一个随机数并且可以设置步长,同样可以设置随机数种子
(3)与列表相关的过滤器
length,first,last,random,shuffle,upper,lower : 与前面意思相同不同在于是列表
min : 返回列表中最小的值
max : 返回列表中最大的值
sort, sort(reverse=true) :将列表升序排序输出,将列表降序排序输出
sum : 返回纯数字非嵌套列表中所有数字的和
flatten : 那么使用flatten可以’拉平’嵌套的列表
join, join(‘ , ‘) : 列表元素合成字符串还可以每个元素之间用指定的字符隔开;
unique : 去掉列表中重复的元素,重复的元素只留下一个
union(testvar12) : 两个列表的并集
intersect(testvar12) : 两个列表的交集
symmetric_difference(testvar12) : 去除两个列表的补集
difference(testvar12) : 两个列表的交集在列表1中的补集
(4)变量未定义时相关操作的过滤器
default(‘WeiyiGeek’) : 如果变量没有定义,则临时返回一个指定的默认值
mandatory : 如果对应的变量未定义,则报出“Mandatory variable not defined.”错误
基础示例1:
[TOC]
常用过滤器一(filters) 描述:”过滤器(filters)”可以帮助我们对数据进行处理,ansible中的过滤器功能来自于jinja2模板引擎
,我们可以借助jinja2的过滤器功能在ansible中对数据进行各种处理;很多其他的过滤器有些是jinja2内置的有些是ansible特有,变量和过滤器之间采用类似于管道符进行拼接;
(1)字符串操作有关的过滤器:
upper 过滤器 : 将所有小写字母都被变成了大写
lower 过滤器 : 将所有大写字母都被变成了小写
capitalize 过滤器 : 将字符串变成首字母大写,之后所有字母纯小写
reverse 过滤器 : 将字符串反转
list 过滤器 : 将字符串转换成列表,每个字符作为一个元素
shuffle 过滤器 : 字面意思为洗牌,将字符串转换成列表每个字符作为一个元素,并且随机打乱顺序 #在随机打乱顺序时将ansible_date_time.epoch的值设置为随机种子
first 过滤器 : 返回字符串的第一个字符
last 过滤器 : 返回字符串的最后一个字符
length 过滤器 : 返回字符串长度,length与count等效,可以写为count
center(width=30) : 将字符串放在中间,并且设置字符串的长度默认以0补齐
(2)数字操作有关的过滤器
int,int(default=6) : 将对应的值转换成int类型,将对应的值转换成int类型,如果无法转换,默认返回0
float,float(8.88) : 将对应的值转换成浮点型,如果无法转换,默认返回’0.0’,当对应的值无法被转换成浮点型时,则返回指定值’8.8‘
abs : 获取对应数值的绝对值
round,round(5): 四舍五入或者取小数点后
random(seed=(ansible_date_time.epoch)),random(start=5),random(start=5,step=3): 随机返回一个随机数并且可以设置步长,同样可以设置随机数种子
(3)与列表相关的过滤器
length,first,last,random,shuffle,upper,lower : 与前面意思相同不同在于是列表
min : 返回列表中最小的值
max : 返回列表中最大的值
sort, sort(reverse=true) :将列表升序排序输出,将列表降序排序输出
sum : 返回纯数字非嵌套列表中所有数字的和
flatten : 那么使用flatten可以’拉平’嵌套的列表
join, join(‘ , ‘) : 列表元素合成字符串还可以每个元素之间用指定的字符隔开;
unique : 去掉列表中重复的元素,重复的元素只留下一个
union(testvar12) : 两个列表的并集
intersect(testvar12) : 两个列表的交集
symmetric_difference(testvar12) : 去除两个列表的补集
difference(testvar12) : 两个列表的交集在列表1中的补集
(4)变量未定义时相关操作的过滤器
default(‘WeiyiGeek’) : 如果变量没有定义,则临时返回一个指定的默认值
mandatory : 如果对应的变量未定义,则报出“Mandatory variable not defined.”错误
基础示例1:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 --- - hosts: local remote_user: root gather_facts: no vars: testvar: "abc123ABC 666" testvar1: " abc " testvar2: '123456789' testvar3: "1a2b,@#$%^&" tasks: - debug: msg: "{{ testvar | upper }} " - debug: msg: "{{ testvar | lower }} " - debug: msg: "{{ testvar | capitalize }} " - debug: msg: "{{ testvar | reverse }} " - debug: msg: "{{ testvar | first }} " - debug: msg: "{{ testvar | last }} " - debug: msg: "{{ testvar1 | trim }} " - debug: msg: "{{ testvar1 | center(width=30) }} " - debug: msg: "{{ testvar2 | length }} " - debug: msg: "{{ testvar3 | list }} " - debug: msg: "{{ testvar3 | shuffle }} " - debug: msg: "{{ testvar3 | shuffle(seed=(ansible_date_time.epoch)) }} END
基础示例1:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 --- - hosts: test70 remote_user: root vars: testvar4: -1 tasks: - debug: msg: "{{ 8+('8' | int) }} " - debug: msg: "{{ 'a' | int(default=6) }} " - debug: msg: "{{ '8' | float }} " - debug: msg: "{{ 'a' | float(8.88) }} " - debug: msg: "{{ testvar4 | abs }} " - debug: msg: "{{ 12.5 | round }} " - debug: msg: "{{ 3.1415926 | round(5) }} " - debug: msg: "{{ 100 | random }} " - debug: msg: "{{ 10 | random(start=5) }} " - debug: msg: "{{ 15 | random(start=5,step=3) }} " - debug: msg: "{{ 15 | random(step=5) }} " - debug: msg: "{{ 15 | random(seed=(ansible_date_time.epoch)) }} " END
基础示例2:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 cat >filtersList.yml<<END --- - hosts: local 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: - debug: msg: "{{ testvar7 | length }} " - debug: msg: "{{ testvar7 | first }} " - debug: msg: "{{ testvar7 | last }} " - debug: msg: "{{ testvar7 | min }} " - debug: msg: "{{ testvar7 | max }} " - debug: msg: "{{ testvar7 | sort }} " - debug: msg: "{{ testvar7 | sort(reverse=true) }} " - debug: msg: "{{ testvar7 | sum }} " - debug: msg: "{{ testvar8 | flatten }} " - debug: msg: "{{ testvar8 | flatten(levels=1) }} " - debug: msg: "{{ testvar8 | flatten | max }} " - debug: msg: "{{ testvar9 | join }} " - debug: msg: "{{ testvar9 | join(' , ') }} " - debug: msg: "{{ testvar9 | random }} " - debug: msg: "{{ testvar9 | random(seed=(ansible_date_time.epoch)) }} " - debug: msg: "{{ testvar9 | shuffle }} " - debug: msg: "{{ testvar9 | shuffle(seed=(ansible_date_time.epoch)) }} " - debug: msg: "{{ testvar10 | upper }} " - debug: msg: "{{ testvar10 | lower }} " - debug: msg: "{{ testvar11 | unique }} " - debug: msg: "{{ testvar11 | union(testvar12) }} " - debug: msg: "{{ testvar11 | intersect(testvar12) }} " - debug: msg: "{{ testvar11 | difference(testvar12) }} " - debug: msg: "{{ testvar11 | symmetric_difference(testvar12) }} " END
基础示例3:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 cat >filtersVarible.yml<<END --- - hosts: test70 remote_user: root gather_facts: no vars: testvar6: '' tasks: - debug: msg: "{{ testvar5 | default('WeiyiGeek') }} " - debug: msg: "{{ testvar6 | default('WeiyiGeek',boolean=true) }} " - debug: msg: "{{ testvar5 | mandatory }} " END
default过滤器还有一个很方便的用法,不仅能在变量未定义时返回指定的值,还能够让模块的参数变得”可有可无”
如果item有mode属性,就把file模块的mode参数的值设置为item的mode属性的值
如果item没有mode属性,file模块就直接省略mode参数’omit’的字面意思就是”省略”
实际案例:对应其中一个建立建立的文件进行权限设定,而其他建立的文件则设置为系统缺省权限;1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 --- - hosts: local remote_user: root gather_facts: no 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)}} #我们并没有对文件是否有mode属性进行判断,而是直接调用了file模块的mode参数 with_items: "{{ paths }} " END
过滤器的用法详细:
json_query 过滤器 描述:如果有时候您从某处API接口进行请求并且成功返回一串json字符串的话,有当您打开后发现里面是杂乱无章的这时可以借助于我们的ansible神器;1 {"logs" :[{"domain" :"test.com" ,"url" :"?key=asdashashdhad&uid=124" },{"domain" :"test.com" ,"url" :"?key=jioenlkhuxcai&uid=125" }]}
将这段数据所在的文件当做变量文件引入到playbook中,然后输出对应的变量即可;1 2 3 4 5 6 7 8 9 10 --- - hosts: test70 remote_user: root gather_facts: no tasks: - include_vars: file: "/testdir/ansible/CDN.log" name: testjson - debug: msg: "{{test.json}} "
运行上面这段脚本后便会将杂乱无章的json格式化显示; 原因:其实json是yaml的子集
,yaml是json的超集
,yaml格式的数据和json格式的数据是可以互相转换
的,所以对于ansible来说,当我们把上例中的json数据文件当做变量文件引入时,就好像引入了一个我们定义好的yaml格式的变量文件一样,对于ansible来说是没有区别的,而且,即使在变量文件中使用yaml格式定义了变量,在使用debug模块输出变量信息时,ansible也会自动将yaml格式的数据转化为json格式后进行输出;
我们把上述json数据转换成yaml的格式,同时列出上述数据的json格式与yaml格式,你可以根据自己的使用习惯选择阅读哪种格式的数据,以便你能够更好的理解这段数据的含义,yaml格式如下:1 2 3 4 5 6 7 8 9 10 11 12 --- logs: - domainName: test.com files: - dateFrom: 2018-09-05-0000 url: ?key=asdashashdhad&uid=124 - domainName: test123.com files: - dateFrom: 2018-09-05-0000 url: ?key=asdashashdhad&uid=124 END
此刻如果我们想要获取到整个列表中的所有日志文件的Url,我们该怎么办呢? 答:我们有两种方式一种是通过with_subelements,另外一种是通过json_query的过滤器实现;1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 --- - hosts: local remote_user: root gather_facts: no tasks: - include_vars: file: "/root/filter.txt" name: vartest - debug: msg: "{{item.1.url}} " with_subelements: - "{{vartest.logs}} " - files END
执行结果:(坑呀)1 2 3 4 5 6 7 TASK [debug] ok: [local ] => (item=[{u'domainName' : u'test.com' }, {u'url' : u'?key=asdashashdhad&uid=124' , u'dateFrom' : u'2018-09-05-0000' }]) => { "msg" : "?key=asdashashdhad&uid=124" } ok: [local ] => (item=[{u'domainName' : u'test123.com' }, {u'url' : u'?key=asdashashdhad&uid=124' , u'dateFrom' : u'2018-09-05-0000' }]) => { "msg" : "?key=asdashashdhad&uid=124" }
json_query过滤器 描述:可以直接提取json数据,可以进行通配符进行配置,从而比上面采用with_subelement更加的简便;在复现上面的实例的时候我们先来看看你它如何使用; 基础示例:1 2 3 4 5 6 7 8 9 10 11 12 13 14 --- users: - name: tom age: 17 hobby: - run - pingpang - name: jerry age: 12 hobby: - computer - basketball END
当数据结构中存在列表时,我们可以使用\”列表名[*]\”获取到列表下面的所有项
使用json_query过滤器对这个变量进行了处理json_query(‘users[*].name’)表示找到users列表中所有元素的name属性
使用json_query(‘test.users[?name==`tom`].hobby[*]’)表示只查找users列表中name属性等于tom的hobby信息 (注意是反引号)
使用json_query(‘test.users[*].{uname:name,uage:age}’)表示找到users列表中所有用户的name值和age值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 --- - hosts: local remote_user: root gather_facts: no tasks: - include_vars: file: "/root/filter1.txt" name: vartest - name: "json_query Demo 1 : Name" debug: msg: "{{vartest | json_query('users[*].name')}} " - name: "json_query Demo 2 : Hobby" debug: msg: "{{vartest | json_query('users[*].hobby[*]')}} " - name: "Advances json_query Demo1" debug: msg: "{{vartest | json_query('users[?name==\`tom\`].hobby[*]')}} " - name: "Advances json_query Demo2" debug: msg: "{{vartest | json_query('users[*].{username:name,userage:age}')}} " END `
执行结果:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 TASK [json_query Demo 1 : Name] ok: [local ] => { "msg" : ["tom" ,"jerry" ] } TASK [json_query Demo 2 : Hobby] ok: [local ] => { "msg" : [ ["run" , "pingpang" ], ["computer" ,"basketball" ] ] } TASK [Advances json_query Demo] ok: [local ] => { "msg" : [["run" ,"pingpang" ]] } TASK [Advances json_query Demo2] ok: [local ] => { "msg" : [ {"userage" : 17, "username" : "tom" }, { "userage" : 12, "username" : "jerry" } ] }
回归最初的示例:1 2 3 4 5 6 7 8 9 10 11 12 13 --- - hosts: local remote_user: root gather_facts: no tasks: - include_vars: file: "/root/filter.txt" name: vartest - name: "json_query Filter Demo" debug: msg: "{{vartest|json_query('logs[*].files[*].url')}} " END
执行结果:1 2 3 4 5 TASK [json_query Filter Demo] ok: [local ] => { "msg" : [["?key=asdashashdhad&uid=124" ], ["?key=asdashashdhad&uid=124" ]] }
常用过滤器二 描述:继续总结一些使用的过滤器,可以直接采用cmd进行测试:1 2 ansible local -m debug -e "path=/bin/bash" -a "msg={{path|realpath}}"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 --- - hosts: test70 remote_user: root gather_facts: no tasks: - shell: "echo {{teststr | quote}} > /testdir/testfile" vars: teststr: "a\nb\nc" - debug: msg: "{{ (name == 'John') | ternary('Mr','Ms') }} " vars: name: "John" - debug: msg: "{{teststr | basename}} " vars: teststr: "/testdir/ansible/testfile" - debug: msg: "{{teststr | win_basename}} " vars: teststr: 'D:\study\WeiyiGeek' - debug: msg: "{{teststr | dirname}} " vars: teststr: "/testdir/ansible/testfile" - debug: msg: "{{teststr | win_dirname}} " vars: teststr: 'D:\study\WeiyiGeek' - debug: msg: "{{teststr | win_splitdrive}} " vars: teststr: 'D:\study\WeiyiGeek' - debug: msg: "{{ path | realpath }} " vars: path: "/testdir/ansible/testsoft" - debug: msg: "{{ path | relpath('/testdir/testdir') }} " vars: path: "/testdir/ansible" - debug: msg: "{{ path | splitext }} " vars: path: "/etc/nginx/conf.d/test.conf" - debug: msg: "{{ teststr | to_uuid }} " vars: teststr: "This is a test statement" - debug: msg: "{{ teststr | bool }} " vars: teststr: "1"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 - vars: users: - name: tom age: 18 hobby: - Skateboard - VideoGame - name: jerry age: 20 hobby: - Music debug: msg: "{{ users | map(attribute='name') | list }} " - debug: msg: '{{ ("2016-08-14 20:00:12"| to_datetime) - ("2012-12-25 19:00:00" | to_datetime) }} ' - debug: msg: '{{ ("20160814"| to_datetime("%Y%m%d")) - ("2012-12-25 19:00:00" | to_datetime) }} ' - debug: msg: '{{ ( ("20160814"| to_datetime("%Y%m%d")) - ("20121225" | to_datetime("%Y%m%d")) ).total_seconds() }} ' - debug: msg: '{{ ( ("2016-08-14 20:00:12"| to_datetime) - ("2012-12-25 08:30:00" | to_datetime) ).seconds }} ' - debug: msg: '{{ ( ("2016-08-14 20:00:12"| to_datetime) - ("2012-12-25 08:30:00" | to_datetime) ).days }} ' - debug: msg: "{{ 'hello' | b64encode }} " - debug: msg: "{{ 'aGVsbG8=' | b64decode }} " - debug: msg: "{{ '123456' | hash('sha1') }} " - debug: msg: "{{ '123456' | hash('md5') }} " - debug: msg: "{{ '123456' | checksum }} " - debug: msg: "{{ '123456' | hash('blowfish') }} " - debug: msg: "{{ '123456' | password_hash('sha256') }} " - debug: msg: "{{ '123456' | password_hash('sha256','mysalt') }} " - debug: msg: "{{ '123123' | password_hash('sha512') }} " - debug: msg: "{{ '123123' | password_hash('sha512','.U5cjaHe55KK') }} " - debug: msg: "{{ '123123' | password_hash('sha512', 65534|random(seed=inventory_hostname)|string) }} "