自动化运维—playbook(ansible-过滤器)
文章目录
- 自动化运维---playbook(ansible-过滤器)
- 1.过滤器是什么
- 2.基于字符串的过滤
- 3.基于数值的过滤:
- 4.基于列表的过滤
- 5.针对为定义变量和空变量的过滤
- playbook5
1.过滤器是什么
过滤器是一种能够帮助我们处理数据的工具,其实ansible中的过滤器功能来自于jinja2模板引擎,我们可以借助jinja2的过滤器功能在ansible中对数据进行各种处理,而上例中的upper就是一种过滤器, 这个过滤器的作用就是将小写字母变成大写
你一定已经发现了:当我们想要通过过滤器处理数据时,只需要将数据通过管道符传递给对应的过滤器即可
当然,过滤器不只有upper,还有很多其他的过滤器,这些过滤器有些是jinja2内置的,有些是ansible特有的,如果这些过滤器都不能满足你的需求,jinja2也支持自定义过滤器。
2.基于字符串的过滤
vim gl1.yml
---
- hosts: testB
remote_user: root
vars:
testvar: "abc123ABC 666"
testvar1: " abc "
testvar2: "123456789"
testvar3: "1a2x3c.#$@!"
tasks:
- debug:
#将字符串转换成纯大写
msg: "{{testvar | upper}}"
- debug:
#将字符串转换成纯小写
msg: "{{testvar | lower}}"
- debug:
#将字符串变成首字母大写,之后字母纯小写(相当于python中的title)
msg: "{{testvar | capitalize}}"
- debug:
#将字符串反转
msg: "{{testvar | reverse}}"
vim gl1.yml
---
- hosts: testB
remote_user: root
vars:
testvar: "abc123ABC 666"
testvar1: " abc "
testvar2: "123456789"
testvar3: "1a2x3c.#$@!"
tasks:
- debug:
#返回字符串的第一个字符
msg: "{{testvar | first}}"
- debug:
#返回字符串的最后一个字符
msg: "{{testvar | last}}"
- debug:
#将字符串开头和结尾的空格去除
msg: "{{testvar1 | trim}}"
- debug:
#将字符串放在中间,并且设置字符串长度为30,两边用空格补齐30位长
msg: "{{testvar1 | center(width=30) }}"
vim gl1.yml
---
- hosts: testB
remote_user: root
vars:
testvar: "abc123ABC 666"
testvar1: " abc "
testvar2: "123456789"
testvar3: "1a2x3c.#$@!"
tasks:
- debug:
#返回字符串长度,length与count等效,可以写为count
msg: "{{testvar2 | length}}"
- debug:
#将字符串转换成列表,每一个字符作为一个元素
msg: "{{testvar3 | list}}"
- debug:
#将字符串转换成列表,每一个字符作为一个元素,并且随机打乱顺序
msg: "{{testvar3 | shuffle }}"
3.基于数值的过滤:
vim gl2.yml
---
- hosts: testB
remote_user: root
vars:
testvar: -1
tasks:
- debug:
#数值和字符串无法进行运算,把字符串转化成int类型,再相加
msg: "{{ 8+('8' | int )}}"
- debug:
#将对应的值转化成int类型,如果无法转换,默认返回0;如果指定default的值,则返回指定值
msg: "{{'a' | int(default=10) }}"
- debug:
#将对应的值转化成浮点型,如果无法转换,默认返回'0.0'
msg: "{{ '8' | float }}"
- debug:
#获取对应数值的绝对值
msg: "{{ testvar | abs }}"
vim gl2.yml
---
- hosts: testB
remote_user: root
tasks:
- debug:
#四舍五入
msg: "{{ 5.7 | round }}"
- debug:
#取小数点后5位
msg: "{{ 3.1243574 | round(5) }}"
- debug:
#从0到100随机返回一个随机数
msg: "{{ 100 | random }}"
- debug:
#从5到100中随机返回一个随机数
msg: "{{ 100 | random(start=5) }}"
- debug:
#从5到15中随机返回一个随机数,步长为3(即从5,8,11,14中随机返回)
msg: "{{ 15 | random(start=5,step=3) }}"
4.基于列表的过滤
vim gl3.yml
---
- hosts: testB
remote_user: root
vars:
testvar1: [13,55,2,3,17,22,40]
testvar2: [2,[6,3,[9,5]],7,8]
tasks:
- debug:
#返回列表长度,length与count等效,可以写为count
msg: "{{ testvar1 | length }}"
- debug:
#返回列表中的第一个值
msg: "{{ testvar1 | first }}"
- debug:
#返回列表中的最后一个值
msg: "{{ testvar1 | last }}"
- debug:
#返回列表中最小的值
msg: "{{ testvar1 | min }}"
- debug:
#返回列表中最大的值
msg: "{{ testvar1 | max }}"
vim gl3.yml
---
- hosts: testB
remote_user: root
vars:
testvar1: [13,55,2,3,17,22,40]
testvar2: [2,[6,3,[9,5]],7,8]
tasks:
- debug:
#将列表升序排序输出
msg: "{{ testvar1 | sort }}"
- debug:
#将列表降序排序输出
msg: "{{ testvar1 | sort(reverse=true) }}"
- debug:
#返回纯数字非嵌套列表中所有数字的和
msg: "{{ testvar1 | sum }}"
- debug:
#如果列表中包含列表,那么使用flatten可以‘拉平’嵌套的列表(2.5版本以上可用)
msg: "{{ testvar2 | flatten }}"
- debug:
#返回列表中嵌套了列表,那么将第一层的嵌套列表‘拉平’
msg: "{{ testvar2 | flatten(levels=1) }}"
- debug:
#过滤器都是可以自由结合使用的,就像linux命令中的管道符一样
#取出嵌套列表中的最大值
msg: "{{ testvar2 | flatten | max }}"
vim gl3.yml
---
- hosts: testB
remote_user: root
vars:
testvar1: [1,'A',4]
testvar2: [2,'A','b',['wechat','QQ'],'svFC']
tasks:
- debug:
#将列表中的元素合并成一个字符串
msg: "{{ testvar1 | join }}"
- debug:
#将列表中的元素合并成一个字符串,每个元素之间用指定字符隔开
msg: "{{ testvar1 | join(' # ') }}"
- debug:
#从列表中随机返回一个元素
msg: "{{ testvar1 | random }}"
- debug:
#随机打乱顺序列表中元素的顺序
msg: "{{ testvar1 | shuffle }}"
- debug:
#将列表中行的每个元素变成纯大写
msg: "{{ testvar2 | upper }}"
- debug:
#将列表中行的每个元素变成纯小写
msg: "{{ testvar2 | lower }}"
vim gl3.yml
---
- hosts: testB
remote_user: root
vars:
testvar1: ['abc',1,2,'a',2,1,'abc']
testvar2: ['abc',3,'a','b','a']
tasks:
- debug:
#去掉列表中重复的元素,重复的元素只留一个
msg: "{{ testvar1 | unique }}"
- debug:
#将两个列表合并,重复的元素只留一个
msg: "{{ testvar1 | union(testvar2) }}"
- debug:
#取出存在于tedtvar1列表中,但不存在于testvar2列表中的元素
#去重后重复的元素只留一个
#即两个列表中的交集再列表1(testvar1)中的补集
msg: "{{ testvar1 | difference(testvar2) }}"
- debug:
#取出两个列表中各自独有的元素,重复的元素只留下一个
#即取出两个列表的交集,剩余的元素
msg: "{{ testvar1 | symmetric_difference(testvar2) }}"
5.针对为定义变量和空变量的过滤
vim gl4.yml
---
- hosts: testB
remote_user: root
gather_facts: no
vars:
testvar: ''
tasks:
- debug:
msg: "{{ testvar1 | default('yy') }}"
我们可以看到,当变量未定义时,使用default过滤,它会给变量赋上默认值yy
vim gl4.yml
---
- hosts: testB
remote_user: root
gather_facts: no
vars:
testvar: ''
tasks:
- debug:
msg: "{{ testvar | default('yy') }}"
当变量定义为空时,设定默认值为yy,但它还是会以"“来输出(即认定变量的值为”")
vim gl4.yml
---
- hosts: testB
remote_user: root
gather_facts: no
vars:
testvar: ''
tasks:
- debug:
msg: "{{ testvar | default('pp',boolean=true) }}"
当变量定义为空""时,加上boolean=true参数,表示认为变量未定义和定义未空都表示未定义变量,所以输出默认值pp
vim gl4.yml
---
- hosts: testB
remote_user: root
gather_facts: no
vars:
testvar: ''
tasks:
- debug:
msg: "{{ testvar1 | mandatory }}"
当变量未定义时,使用mandatory,会报错
playbook5
如果我们想在远程主机中批量创建目录,但有些目录的权限不是默认值,而是我们自己设定的,应该如何写?
写法1:
vim touch1.yml
---
- hosts: testB
remote_user: root
gather_facts: no
vars:
paths:
- path: /tmp/test1
mode: '0444'
- path: /tmp/test2
- path: /tmp/test3
tasks:
- file: dest={{item.path}} state=touch mode={{item.mode}}
with_items: "{{ paths }}"
when: item.mode is defined
- file: dest={{item.path}} state=touch
with_items: "{{ paths }}"
when: item.mode is undefined
说明:这种写法分成了两种情况,运用判断,当设定了mode参数时,创建文件的权限已设定值为准;当没有设定mode时,以默认权限创建
写法2:运用过滤器
---
- hosts: testB
remote_user: root
gather_facts: no
vars:
paths:
- path: /tmp/test1
mode: '0444'
- path: /tmp/test2
- path: /tmp/test3
tasks:
- file: dest={{item.path}} state=touch mode={{item.mode | default(omit)}}
with_items: "{{ paths }}"
说明:这里比上面的省略了一次判断和循环,mode={{item.mode | default(omit)}}表示如果有指定mode就用指定的值,如果没有就省略,omit表示省略(即有就用,没有就不用)