Ansible过滤器使用总结

前言

不知道Python中的Jinja2模板语言有没有听过,没听过不要紧,它不是今天的重点,你也可以抽空去百度一下。今天的重点是Jinja2中内置的filter功能,这个filter可以用来在管理节点上执行并操作数据。在Ansible中,不仅可以使用Jinja2自带的过滤器,还可以使用Ansible提供的过滤器,以及我们根据自己的需要自定义的过滤器,我们可以通过使用这些过滤器来实现一些复杂的功能,从而实现我们的工作效率。开始吧~

本文中涉及的试验环境信息如下:

服务器信息如下:
192.168.5.2 # 管理主机
192.168.5.3 # 被管理远程主机
192.168.5.4 # 被管理远程主机


inventory文件内容如下:
[web]
192.168.5.3
192.168.5.4

基础使用

下面先通过一个简单的例子来看看Ansible filter怎么使用,有一个初步的印象。

---


  - hosts: web
    gather_facts: False
    vars:
      param: WWW.JELLYTHINK.COM
    tasks:
      - name: lower filter demo
        debug: msg="Welcome to {{param | lower}}"

上面输出结果如下:

5815602192ec9ecf4af81f9934f8bb88.png

过滤器都是在{{}}中使用。这里通过一个简单的过滤器lower来演示了基础的使用,通过lower过滤器实现把变量转换成全小写字母。下面开始一些更实用的操作吧。

对普通变量的操作

  • default:为没有定义的变量提供默认值
    在Ansible中,如果使用了未定义的变量就会出现错误;对于未定义的变量,我们可以使用default来为没有定义的变量提供一个 默认值。

  • mandatory:强制变量必须定义,否则抛错
    在Ansible的默认配置中有这么个配置error_on_undefined_vars = False;这个配置的含义是如果遇到未定义的变量时,Ansible就不会抛错,但是这个配置默认是关的,所以在默认情况下,使用未定义的变量就会抛错。

  • bool:判断变量是否为布尔类型
    bool过滤器是用来判断变量是否为布尔类型,字符串的内容为yes、1、True、true则返回布尔值True,字符串内容为其他内容则返回False。

  • ternary:Playbook的条件表达式
    ternary类似于编程中的三目运算符。

下面通过一个playbook来看看上面的操作:

---


  - hosts: web
    gather_facts: False
    vars:
      website: www.jellythink.com
      boolValue: True
    tasks:
      - name: default
        debug: msg="Welcome to {{undefined_value | default('Default Value')}}"
        
      - name: mandatory
        debug: msg="{{undefined_value | mandatory}}"


      - name: bool
        debug: msg="boolvalue is True"
        when: boolValue | bool


      - name: ternary
        debug: msg="{{(website == 'www.jellythink.com') | ternary('果冻想', '其他')}}"

由于mandatory用在了未定义的变量上,所有就中断了mandatory后面task的执行,上面的输出内容如下:

8e046e397592cbfad8aca2efd571e9f8.png

去掉mandatorytask,执行结果如下:

dbf8ff1c0db44bc6827dc9be35c254af.png

对文件路径的操作

Ansible为了方便对文件和路径进行操作,提供了包含获取文件名、路径名等等的操作,因为Linux和Windows文件系统的路径名差异比较大,所以过滤器根据不同的系统,分别提供了不同类型的过滤器来处理。

Linux文件路径的操作过滤器如下:

  • basename:获取路径中的文件名

  • dirname:获取文件的目录

  • expanduser:扩展~为实际的目录

  • realpath:获得链接文件所指文件的真实路径

  • splitext:把文件名用点号分割成多个部分

---


- hosts: 192.168.5.3
  gather_facts: False
  vars:
    linuxAbsPath: "/home/yanggd/ansible/yaml/filterTest2.yaml"
    linuxRelPath: "~/ansible/yaml/filterTest2.yaml"
  tasks:
    - name: basename
      debug: msg="basename is  {{linuxAbsPath | basename}}"


    - name: dirname
      debug: msg="dirname is  {{linuxAbsPath | dirname}}"


    - name: expanduser
      debug: msg="expanduser is  {{linuxRelPath | expanduser}}"


    - name: splitext
      debug: msg="splitext is  {{'filterTest2.yaml' | splitext}}"

输出结果如下:

e681be8fe4c3166069e2ff8848e218b6.png

Windows文件路径的操作过滤器如下:

  • win_basename:获得Windows路径的文件名

  • win_dirname:获得Windows路径的文件目录

  • win_splitdrive:把Windows路径分割成多个部分

windows的就不在这里演示了。

对字符串变量的操作

  • quote:给字符串加引号

  • base64:得到字符串的Base64编码

  • hash:获取字符串的哈希值

  • regex:利用正则表达式对字符串进行替换

  • ip:判断字符串是否是合法的IP地址

对JSON的操作

  • format:将变量的值按照JSON/YAML的格式输出

  • json_query:在一个JSON对象里,搜索符合条件的属性,返回符合条件的属性数组

  • combine:合并两个JSON对象的值

对数据结构的操作

Ansible中的过滤器支持以下几种类型的数据结构的操作:

  • random:取随机数

  • 对List操作

  • 对Set操作

链式使用

Ansible的过滤器是支持链式使用的,即在一个{{}}中使用多个过滤器。

代码示例

---


- hosts: 192.168.5.3
  gather_facts: False
  vars:
    des: "My website is www.jellythink.com"
    ipaddress: "192.168.5.3"
  tasks:
    # 给字符串添加双引号
    - name: quote
      debug: msg="echo {{des | quote}}"


    # base64编码
    - name: b64encode
      debug: msg="{{des | b64encode}}"
      register: encodeValue


    # base64解码
    - name: b64decode
      debug: msg="{{encodeValue.msg | b64decode}}"


    # sha1哈希值
    - name: sha1 hash
      debug: msg="sha1 hash is {{des | hash('sha1')}}"


    # ipaddr
    - name: ipaddr
      debug: msg="{{ipaddress | ipaddr}}"


    # ipv4
    - name: ipv4
      debug: msg={{ipaddress | ipv4}}


    # md5哈希值
    - name: md5 hash
      debug: msg="md5 hash is {{des | hash('md5')}}"


    # 取两次随机数,链式调用
    - name: random
      debug: msg={{100 | random | random}}


    # 取随机数1,从2开始,步值是10
    - name: random1
      debug: msg={{100 | random(2, 10)}}

输出结果如下:

d5da346248694cd96abb6c89c79a140e.png

总结

哦,写到最后面就不想再通过代码示例来说明如何使用了,因为有几个例子知道怎么使用就OK了,后面就是手册一样的知识点了,好了,这篇文章就当手册来读就好了,知道有这么个东西,以后使用的时候能想起来就可以了。


人生是个圆,有的人走了一辈子也没有走出命运画出的圆圈,其实,圆上的每一个点都有一条腾飞的切线。

c46625667ff4df78a5d90ba9e2102651.jpeg

玩代码、玩技术

长按识别二维码,关注“果冻想”

如果觉得还不错,可以点个“在看”哦~

posted @ 2020-10-29 08:23  ^_^果冻^_^  阅读(3)  评论(0编辑  收藏  举报  来源