Ansible过滤器使用总结

作者:神秘网友 发布时间:2020-11-01 00:00:59

Ansible过滤器使用总结

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

上面输出结果如下:

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过滤器使用总结

玩代码、玩技术

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

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

Ansible过滤器使用总结相关教程

  1. 使用Python创建词云

    使用Python创建词云 介绍 从开始从事数据可视化工作的那一天起,我就爱上它了,我总是喜欢从数据中获得有用的见解。 在此之前,我只了解基本图表,例如条形图,散点图,直方图等,这些基本图表内置在tableau中,而Power BI则用于数据可视化。通过每天完成此任

  2. 使用PolyGen和PyTorch生成3D模型

    使用PolyGen和PyTorch生成3D模型 深度学习研究的一个新兴领域是致力于将DL技术应用于3D几何和计算机图形应用程序, 对于希望自己尝试3D深度学习的PyTorch用户而言,一个叫Kaolin 库值得研究。 对于TensorFlow用户,还有TensorFlow Graphics库。 3D技术中一个

  3. C#的数组和集合

    C#的数组和集合 数组的概念 一维数组和二维数组的使用 动态数组 数组的操作运算 ArrayList集合类的使用与操作 数组定义需要包含以下要素: 元素类型 数组维数 每个维度的上下限 声明,初始化语法: int [] arr=new int[8];//一维(8个数)int [,]arr=new int[3,

  4. 科研楼底服务器使用方法 For Lab1005

    科研楼底服务器使用方法 For Lab1005 注意: (该方式 只支持一个人使用 ,为了保证机器的运行稳定,也只推荐一个时间只有一个用户使用。大家可以在自己的机器上 先把代码调试好,然后上传到服务器跑 , 使用之前在群里问一嘴有没有人在用 ) 咱们实验室的309

  5. 使用tftpd32.exe将编译好的文件传入MTK7561开发板、以太网配置多

    使用tftpd32.exe将编译好的文件传入MTK7561开发板、以太网配置多个静态地址 使用tftpd32.exe将编译好的文件传入MTK7561开发板 链接:https://pan.baidu.com/s/1gU5Mf8vuYTfdUGSQVUv20Q 提取码:xxxx 将需要传入的文件放到该tftpd32.exe文件所在目录,运行tftp

  6. 使用 Nginx 服务器配置 flv、mp4,可以直接浏览器播放

    使用 Nginx 服务器配置 flv、mp4,可以直接浏览器播放 由于需求,需要提供浏览器播放 mp4 和 flv 视频功能。首先浏览器直接支持 flv 和 mp4 格式。只需要在对应的 WEB 服务上完成配置即可。 注意,我的需求是通过浏览器直接播放 MP4,而不是服务器提供 RTMP

  7. 使用Vue和Spring Boot实现前端图片获取

    使用Vue和Spring Boot实现前端图片获取 前端通过后端请求图片数据也是很常见的业务需求,这里博主给大家演示一下。 前端: template div class=blog div class=gain img :src='data:image;base64,'+image button @click=gain()span获取图片/span/button /div

  8. Angular里useExisting和useClass的使用场景

    Angular里useExisting和useClass的使用场景 StackOverflow上的一个帖子:https://stackoverflow.com/questions/45152995/useclass-vs-useexisting 从上图能看出,所有注入的示例都通过factory方法返回,只是factory方法的实现有所差异。 As we can see in the