ansible☞playbook-过滤器

阅读量: zyh 2020-05-11 18:18:44
Categories: > Tags:

前言

不管是过滤器,lookup,query,with_xxx,很多都是获取我们想要的信息。

过滤器

https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html

处理变量值,从而获取想要的信息.

过滤器本身是 jinja2 或者 ansible 官方定义的

简例

---
- hosts: localhost
  remote_user: zyh
  gather_facts: no
  vars:
    vara: abcde
    varb: [1,2,3,A,b,C,d]
    varc: 123
    vard: [ 1,2,3,[4,5,6],4,5 ]
  tasks:
    - name: show upper
      debug:
        msg: "{{ vara | upper}}"

简例中的 upper 即是过滤器,它可以将 vara 中的所有字母元素大写,最终输出 ABCDE

常用的过滤器

#将字符串开头和结尾的空格去除
msg: "{{ vara | trim }}"
#返回字符串或列表长度,length与count等效,可以写为count
msg: "{{ varb | length }}"
# 绝对值
msg: "{{ varc | abs }}"
# 排序(降序排序)
msg: "{{ varb | sort(reverse=true) }}"
# 将列表中第一层嵌套列表元素展开并入列表中,并取出新列表中的最大元素
msg: "{{ vard | flatten(levels=1) | max }}"
# 随机返回一个元素
msg: "{{ varb | random }}"
# 去重
msg: "{{ vard | unique }}"
# 并集
msg: "{{ varb | union(vard) }}"
# 交集
msg: "{{ varb | intersect(vard) }}"
# 补集,取出存在于 varb,但不存在于 vard 中的元素
msg: "{{ varb | difference(vard) }}"
# 去除两个列表交集后的元素
msg: "{{ varb | symmetric_difference(vard) }}"
# 变量未定义,返回默认值 new
msg: "{{ vare | default('new')}}"
# 变量未定义或者定义但为空,返回默认值 new
msg: "{{ vare | default('new', boolean=true)}}"
# 变量未定义时,忽略某个参数
file: xxxx  mode={{ vare | default(omit)}}"  # 若 vare 不存在,则忽略mode参数

json_query

获取特定数据

1. 查询字符串可用变量代替,增加可读性
 loop: "{{ domain_definition | json_query(server_name_cluster1_query) }}"
 vars:
    server_name_cluster1_query: "domain.server[?cluster=='cluster1'].port"
  1. 查询条件
---
- hosts: localhost
  remote_user: zyh
  gather_facts: no
  vars:
    users:
    - name: zhangsan
      gender: male
    - name: lisi
      gender: female
  tasks:
    - name: test 1
      debug:
        msg: "{{ users | json_query('[?name==`zhangsan`].gender') }}"
ok: [localhost] => {
    "msg": [
        "male"
    ]
}

map

映射

---
- hosts: localhost
  remote_user: zyh
  gather_facts: no
  vars:
    users:
    - name: zhangsan
      gender: male
    - name: lisi
      gender: female
  tasks:
    - name: test 1
      debug:
        msg: "{{ users|map(attribute='name') | list }}"
    - name: test 2
      debug:
        msg: "{{ users | json_query('[*].name') }}"
# test 2 是采用 json_query 方式,test1和test2结果一样
ok: [localhost] => {
    "msg": [
        "zhangsan", 
        "lisi"
    ]
}