欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Ansible过滤器使用总结

程序员文章站 2022-07-15 10:47:14
...

前言

不知道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}}"

上面输出结果如下:

Ansible过滤器使用总结

过滤器都是在{{}}中使用。这里通过一个简单的过滤器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的执行,上面的输出内容如下:

Ansible过滤器使用总结

去掉mandatorytask,执行结果如下:

Ansible过滤器使用总结

对文件路径的操作

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

输出结果如下:

Ansible过滤器使用总结

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

输出结果如下:

Ansible过滤器使用总结

总结

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


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

Ansible过滤器使用总结

玩代码、玩技术

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

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