果冻想
认真玩技术的地方

Ansible过滤器使用总结

Ansible是一个系列文章,我会尽量以通俗易懂、诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些。
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}}"

上面输出结果如下:

输出结果

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

输出结果

去掉mandatorytask,执行结果如下:

输出结果

对文件路径的操作

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

输出结果如下:

输出结果

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

输出结果如下:

输出结果

总结

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

果冻想,认真玩技术的地方。

2020年5月24日,于内蒙古呼和浩特。

参考内容

  1. Jinja2内置过滤器
赞(1) 打赏
未经允许不得转载:果冻想 » Ansible过滤器使用总结
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

玩技术,我们是认真的

联系我们关于果冻

感谢支持果冻想

支付宝扫一扫打赏

微信扫一扫打赏