自动化运维—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}}"

ansible lineinfile替换包含关键字一行_bc

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) }}"

ansible lineinfile替换包含关键字一行_字符串_02

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 }}"

ansible lineinfile替换包含关键字一行_字符串_03

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 }}"

ansible lineinfile替换包含关键字一行_vim_04

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) }}"

ansible lineinfile替换包含关键字一行_字符串_05

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 }}"

ansible lineinfile替换包含关键字一行_字符串_06

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 }}"

ansible lineinfile替换包含关键字一行_字符串_07


ansible lineinfile替换包含关键字一行_vim_08

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 }}"

ansible lineinfile替换包含关键字一行_vim_09


ansible lineinfile替换包含关键字一行_字符串_10

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) }}"

ansible lineinfile替换包含关键字一行_bc_11


ansible lineinfile替换包含关键字一行_vim_12

5.针对为定义变量和空变量的过滤

vim gl4.yml
---
- hosts: testB
  remote_user: root
  gather_facts: no
  vars:
    testvar: ''
  tasks:
  - debug:
      msg: "{{ testvar1 | default('yy') }}"

我们可以看到,当变量未定义时,使用default过滤,它会给变量赋上默认值yy

ansible lineinfile替换包含关键字一行_字符串_13

vim gl4.yml
---
- hosts: testB
  remote_user: root
  gather_facts: no
  vars:
    testvar: ''
  tasks:
  - debug:
      msg: "{{ testvar | default('yy') }}"

当变量定义为空时,设定默认值为yy,但它还是会以"“来输出(即认定变量的值为”")

ansible lineinfile替换包含关键字一行_vim_14

vim gl4.yml
---
- hosts: testB
  remote_user: root
  gather_facts: no
  vars:
    testvar: ''
  tasks:
  - debug:
      msg: "{{ testvar | default('pp',boolean=true) }}"

当变量定义为空""时,加上boolean=true参数,表示认为变量未定义和定义未空都表示未定义变量,所以输出默认值pp

ansible lineinfile替换包含关键字一行_vim_15

vim gl4.yml
---
- hosts: testB
  remote_user: root
  gather_facts: no
  vars:
    testvar: ''
  tasks:
  - debug:
      msg: "{{ testvar1 | mandatory }}"

当变量未定义时,使用mandatory,会报错

ansible lineinfile替换包含关键字一行_vim_16

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时,以默认权限创建

ansible lineinfile替换包含关键字一行_bc_17


ansible lineinfile替换包含关键字一行_bc_18


写法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表示省略(即有就用,没有就不用)

ansible lineinfile替换包含关键字一行_字符串_19


ansible lineinfile替换包含关键字一行_bc_20