前言
不管是过滤器,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"
- 查询条件
---
- 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"
]
}