写在前面
「 傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。——–王小波」
Ansible 过滤器
关于Ansible 的过滤器,主要由两部分构成,一部分过滤器通过ansible filter插件提供,包含在 Ansible Engine 中,一部分过滤器通过python模板引擎jinja2提供
在模板引擎中,Ansible 使用 Jinja2 表达式将变量值应用到Playbook和模板。Jinja2 表达式也支持过滤器。过滤器用于修改或处理Playbook或模板中放入的变量的值。关于Jinja2,是基于python的模板引擎,类似Java的Freemarker,在Python Web 中也经常使用,比如Flask常常结合Jinja2 实现前后端不分离的小型Web项目
具体的过滤器列表,小伙伴们可以在下面的路劲看到,当在内 的时候,可以直接查找:
过滤器具体的说明文档:
学习之前,简单回顾下 YAML格式数据文件中的变量的定义方式,熟悉小伙伴可以直接跳过
变量类型
YAML 结构或值内容定义了确切的数据类型。类型包括:
「字符串」
字符串是一系列字符,是Ansible中的默认数据类型。字符串不需要使用引导或双引 括起:
YAML 格式允许定义多行字符,使用竖线(|)保留换行符,或使用大于运算符(>)来取消换行符,(最后一个换行符还是会存在):
---- name: demo var type hosts: servera tasks: - name: var1 vars: string_var: | liruilong and students string_vars: > liruilong and students debug: msg: "{{ string_var }} ||| {{ string_vars }}"
测试一下
$ ansible-playbook var_type.yamlPLAY [demo var type] *********************************************************************************TASK [var1] ******************************************************************************************ok: [servera] => { "msg": "liruilong nand nstudentsn ||| liruilong and students n"}PLAY RECAP *******************************************************************************************servera : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
「数字」
当变量内容是数字时,YAML 会解析字符串,并生成一个数字值,即 Integer 或 Float 类型。
$ cat var_type.yaml---- name: demo var type hosts: servera tasks: - name: var1 vars: string_var: 2.165 string_vars: 456 debug: msg: "{{ string_var }} ||| {{ string_vars + 3 }}"
$ ansible-playbook var_type.yamlPLAY [demo var type] *********************************************************************************TASK [var1] ******************************************************************************************ok: [servera] => { "msg": "2.165 ||| 459"}PLAY RECAP *******************************************************************************************servera : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0$
「布尔值」
布尔值包含 yes、no、y、n、on、off、true 或 false 字符串。不区分大小写,但是 Jinja2 文档中建议使用小写来保持一致。
$ cat var_type.yaml---- name: demo var type hosts: servera tasks: - name: var1 vars: string_var: 2.165 string_vars: 456 boo: yes shell: echo "{{ string_var }}" when: boo
$ ansible-playbook var_type.yamlPLAY [demo var type] *********************************************************************************TASK [var1] ******************************************************************************************changed: [servera]PLAY RECAP *******************************************************************************************servera : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0$
「日期」
如果字符串符合 ISO-8601 标准,YAML 会将字符串转换为 date 类型的值:
「Null」
特殊的 Null 值将变量声明为 undefined:
$ ansible-playbook var_demo.yamlPLAY [var demo] **************************************************************************************TASK [var1 demo] *************************************************************************************ok: [servera] => { "msg": " n"}PLAY RECAP *******************************************************************************************servera : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0$
「列表或数组」
列表(数组)是值的有序集合。列表是数据收集和循环的基本结构。将列表写成以逗 分隔的值序列并用方括 括起,或每行一个元素并加上短划线前缀:可以使用从 0 开始的索引编 来访问列表的特定元素:
$ ansible-playbook var_demo.yamlPLAY [var demo] **************************************************************************************TASK [var1 demo] *************************************************************************************ok: [servera] => { "msg": "v1 ['v1', 'v2', 'v3'] n"}PLAY RECAP *******************************************************************************************servera : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0$ cat var_demo.yaml---- name: var demo hosts: servera vars: param: - v1 - v2 - v3 tasks: - name: var1 demo debug: msg: > {{ param.0 }} {{ param }}$
「字典」
字典(映射或散列)是将字符串键链接到值以进行直接访问的结构,键括在方括 中来访问字典中的项:
$ ansible-playbook var_demo.yamlPLAY [var demo] **************************************************************************************TASK [var1 demo] *************************************************************************************ok: [servera] => { "msg": "{'v1': 10, 'v2': 11, 'v3': 12} 10 n"}PLAY RECAP *******************************************************************************************servera : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0$ cat var_demo.yaml---- name: var demo hosts: servera vars: param_dist: v1: 10 v2: 11 v3: 12 tasks: - name: var1 demo debug: msg: > {{ param_dist }} {{ param_dist['v1'] }}$
使用Jinja2过滤器处理数据
应用过滤器,需要在变量名称后面加上竖线字符和要应用的过滤器的名称。某些过滤器可能需要将可选参数或选项放在括 中。可以在一个表达式中串联多个过滤器。
jinja2支持的过滤器:https://jinja.palletsprojects.com/en/3.0.x/templates/#jinja-filters
在这里插入图片描述
看几个demo
使用 Jinja2 过滤器来将首字母进行大写小写转化:
$ ansible servera -m debug -a 'msg={{ "liruilong" | lower}}'servera | SUCCESS => { "msg": "liruilong"}$ ansible servera -m debug -a 'msg={{ "liruilong" | capitalize }}'servera | SUCCESS => { "msg": "Liruilong"}
将变量转换为另一种类型,如转换为 String 类型:
$ ansible servera -m debug -a 'msg={{ "liruilong" | string }}'servera | SUCCESS => { "msg": "liruilong"}
使用unique过滤器来删除重复数据,使用sort过滤器对其进行排序:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!