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 }}

 

posted @ 2020-04-08 00:05  明王不动心  阅读(1823)  评论(0编辑  收藏  举报