Ansible如何使用Filter插件转换数据

写在前面

  • 今天和小伙伴分享一些Ansible中过滤器
  • 博文内容比较简单
  • 主要介绍的常用过滤器和对应的Demo
  • 使用过滤器如何处理变量
  • 理解不足小伙伴帮忙指正
  • 食用方式:了解Ansible基础语法
  • 「 傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。——–王小波」


    Ansible 过滤器

    关于Ansible 的过滤器,主要由两部分构成,一部分过滤器通过ansible filter插件提供,包含在 Ansible Engine 中,一部分过滤器通过python模板引擎jinja2提供

    在模板引擎中,Ansible 使用 Jinja2 表达式将变量值应用到Playbook模板Jinja2 表达式也支持过滤器。过滤器用于修改或处理Playbook或模板中放入的变量的值。关于Jinja2,是基于python的模板引擎,类似Java的Freemarker,在Python Web 中也经常使用,比如Flask常常结合Jinja2 实现前后端不分离的小型Web项目

    具体的过滤器列表,小伙伴们可以在下面的路劲看到,当在内 的时候,可以直接查找:

  • jinja2 /usr/lib/python3.6/site-packages/jinja2/filters.py
  • Ansible /usr/lib/python3.6/site-packages/ansible/plugins/filter/core.py
  • 过滤器具体的说明文档:

  • jinja2 :https://jinja.palletsprojects.com/en/3.0.x/templates/#builtin-filters
  • Ansible :https://docs.ansible.com/ansible/2.8/user_guide/playbooks_filters.html
  • 学习之前,简单回顾下 YAML格式数据文件中的变量的定义方式,熟悉小伙伴可以直接跳过

    变量类型

    YAML 结构或值内容定义了确切的数据类型。类型包括:

  • 字符串(字符序列)
  • 数字(数值)
  • 布尔值
  • 日期(ISO-8601 日历日期)
  • Null(将变量设置为未定义的变量)
  • 列表或数组(值的有序集合)
  • 字典(键值对的集合)
  • 「字符串」

    字符串是一系列字符,是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 会解析字符串,并生成一个数字值,即 IntegerFloat 类型。

  • Integers 包含十进制字符,并且可以选择在前面加上 + 或 – 符 :
  • 如果数值中包含小数点,则将其解析为 Float:
  • 也可以使用科学记数法表示很大的 Integers 或 Floats:
  • 十六进制数字以 0x 开头,后面仅跟十六进制字符:
  • 如果将数字放在引 中,其将被视为 String:
  • $ 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进行处理,非常感谢!

    上一篇 2022年8月10日
    下一篇 2022年8月10日

    相关推荐