前言
不知道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的执行,上面的输出内容如下:
去掉mandatory
task,执行结果如下:
对文件路径的操作
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了,后面就是手册一样的知识点了,好了,这篇文章就当手册来读就好了,知道有这么个东西,以后使用的时候能想起来就可以了。
人生是个圆,有的人走了一辈子也没有走出命运画出的圆圈,其实,圆上的每一个点都有一条腾飞的切线。
玩代码、玩技术
长按识别二维码,关注“果冻想”
如果觉得还不错,可以点个“在看”哦~