ansible——内置变量和Jinjia2 filter
1.内置变量
playbook中有许多内置变量,列举几个常用的。
(1)groups和group_names
{{ groups }}会打印inventory下面的所有主机和主机组信息
{{ groups['nginx'] }}打印nginx主机组的信息
{{ group_names }}打印当前主机所在的groups名称。
(2)hostvars
{{ hostvars[host] }}会返回某个主机的变量,需要传入诸暨信息,返回一个JSON字符串
(3)inventory_hostname和inventory_hostname_short
{{ inventory_hostname }}返回inventory里定义的主机名
{{ inventory_hostname_short }}返回inventory文件中主机名的第一部分
(4)play_hosts和inventory_dir
{{ play_hosts }}返回当前playbook运行的主机信息
{{ inventory_dir }}返回当前playbook使用的Inventory目录
2.Jinjia2 filter
jinjia2是一个python的模板引擎,主要是受Django模板系统的启发。
关于Django模板系统的博客:https://www.cnblogs.com/yangmingxianshen/p/8283885.html
Ansible默认支持Jinjia2语言内置filter。
Ansible使用jinjia2模板来启动动态表达式和访问变量。
Jinjia2所有的内置filter:http://jinja.pocoo.org/docs/2.10/templates/#builtin-filters
当然Ansible不仅仅只支持Jinjia2的过滤器,还有一些自定义的过滤器。
Ansible中所有过滤器:https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html
格式化数据的过滤器
如果你想某个变量转化为json或者是yaml格式(这样playbook就可以直接使用):
{{ some_variable | to_json }}
{{ some_variable | to_yaml }}
如果你想输出对人类更加友好的方式:
{{ some_variable | to_nice_json }}
{{ some_variable | to_nice_yaml }}
我们还可以设置缩进:
{{ some_variable | to_nice_json (indent = 2)}}
{{ some_variable | to_nice_yaml (indent = 8)}}
to_yaml和to_nice_yaml这两个过滤器使用的是PyYAML这个库,它默认80个字符串长度。
这可能会导致意外的换行符,如果你想避免这种行为,可以配置width属性:
{{ some_variable | to_yaml (indent = 8, width=1204)}}
{{ some_variable | to_nice_yaml (indent = 8, width=1204)}}
如果要解析多文档yaml字符串,使用from_yaml_all可以返回YAML文件的生成。
tasks: - shell: cat /some/path/to/multidoc-file.yaml register: result - debug: msg: '{{ item }}' loop: '{{ result.stdout | from_yaml_all | list }}'
如果我们没有定义一个变量,但是却调用了,这是就会报错:
可以使用mandatory进行显示检查:
{{ variable | mandatory }}
当然,也可以给它一个默认值:
{{ some_variable | default(5) }}
如果在变量计算为false或空字符串使用默认值,则必须将第二个参数设置为true。
{{ lookup('env', 'MY_USER') | default('admin', true) }}
列表过滤器
获取最小值:
{{ list1 | min }}
获取最大值:
{{ [3, 4, 2] | max }}
获取平均值:
{{ [3, [4, 2] ] | flatten }}
还可以指定层级:
{{ [3, [4, [2]] ] | flatten(levels=1) }}
集合过滤器
唯一集:
{{ list1 | unique }}
并集:
{{ list1 | union(list2) }}
交集:
{{ list1 | intersect(list2) }}
差集:
{{ list1 | difference(list2) }}
对称差集:
{{ list1 | symmetric_difference(list2) }}
切片过滤器
将字典转化为列表:
{{ dict | dict2items }}
还可以传入参数:
{{ files | dict2items(key_name='file', value_name='path') }}
压缩过滤器
组合列表:
- name: give me list combo of two lists debug: msg: "{{ [1,2,3,4,5] | zip(['a','b','c','d','e','f']) | list }}"
用尽所有列表:
- name: give me longest combo of three lists , fill with X debug: msg: "{{ [1,2,3] | zip_longest(['a','b','c','d','e','f'], [21, 22, 23], fillvalue='X') | list }}