Templating(Jinja2)
正如变量部分中已经提到的,Ansible 使用 Jinja2 模板来使用动态表达式和访问变量。Ansible 大大扩展了可用的过滤器,并添加了新的插件类型:查找(lookups)。
请注意,在 Ansible 控制器上进行所有模板替换。这样做是为了最大程度地减少对目标主机的要求(仅在控制器上需要 jinja2),并且能够传递任务所需的最少信息,因此目标主机不需要控制器具有的所有数据的副本。
[TOC]
格式化数据的过滤器
以不同格式显示
{{ 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) }}阅读已经格式化的数据
{{ some_variable | from_json }}
{{ some_variable | from_yaml }}例如:
解析多文档 yaml 字符串,使用from_yaml_all过滤器:
未定义变量默认值(default)
如果未定义变量some_variable,则使用的值为 5,而不是抛出错误。
如果要在变量评估为 false 或为空字符串时使用默认值,则必须将第二个参数设置为 true:
省略参数(omit)
对于列表中的前两个文件,默认 mode 将由系统的 umask 决定。
列表过滤
最小数
最大数
展开列表
只展开一级列表:
集合过滤
列表中唯一值
两个列表并集
两个列表交集
两个列表的差异
1 中存在,2 中没有:
两个列表的对称差异
每个列表的独特项:
字典过滤
字典到项目元素
从:
到:
项目元素到字典
从:
到:
items2dict 支持参数:
打包过滤(zip)
打包
用尽所有元素
其他列表不够,使用 fillvalue填充:
快速生成字典
items2dict 和 dict:
从:
到:
子元素过滤
生成一个对象的乘积和该对象的子元素值:
从:
到:
使用 loop过滤:
随机 Mac 地址
随机数
从种子中初始化随机数生成器。这样,您可以创建随机但幂等的数字。
随机过滤
数字
对数(log)
默认为 e:
以 10 为底的对数:
幂(pow)
根(root)
JSON 过滤
集群名
服务名
展示端口
使用 ,号分割:
注意反引号,或者:
通过将单引号加倍,可以在 YAML 中将单引号转义。
hash 映射
IP 过滤
测试字符串是否为 IP:
特定 IP 版本:
IP 地址过滤器也可以用来从 IP 地址中提取特定的信息。例如,要从 CIDR 获取 IP 地址本身:
网络 CLI 过滤
使用parse_cli过滤 JSON 输出:
spec 文件应为有效格式的 YAML。它定义了如何解析 CLI 输出并返回 JSON 数据。
下面是一个有效的 spec 文件示例,该文件将解析show vlan命令的输出。
上面的 spec 文件将返回 JSON 数据结构,该数据结构是带有已解析的 VLAN 信息的哈希列表。
通过使用 key 和 values 指令,可以将同一命令解析为哈希。
解析 CLI 命令的另一个常见用例是将一个大命令分解为可以解析的块:
上面的示例会将show interface的输出解析为哈希列表。
网络 XML 过滤
show vlan | display xml:
Hashing 过滤
获取 sha1
获取 md5
获取 checksum
密码 hash
随机 hash
Hashes 字典组合(Combine)
结果:
递归覆盖:
结果:
多参数合并:
在这种情况下,d 中的键将覆盖 c 中的键,后者将覆盖 b 中的键,依此类推。
提取值
将索引列表映射到容器(哈希或数组)中的值列表
结果:
过滤器可以带另一个参数:
这将获取“ x”组中的主机列表,在 hostvars 中查找它们,然后查找结果的 ec2_ip_address。最终结果是“ x”组中主机的 IP 地址列表。
过滤器的第三个参数也可以是列表,用于在容器内进行递归查找:
注释过滤
使用选定的注释样式装饰文本。
结果:
C (//...), C block (/*...*/), Erlang (%...) and XML (``):
指定字符:
结果:
URL 分割过滤
urlsplit过滤器从 URL 中提取片段,主机名,netloc,密码,路径,端口,查询,方案和用户名。不带参数的情况下,返回所有字段的字典:
正则过滤( regex_search )
查找
匹配所有
替换
在正则表达式中转义特殊字符,请使用regex_escape过滤器:
其他有用的过滤
shell 添加引号
判断
如果相同,则返回Mr:
列表组成字符串
basename
/etc/asdf/foo.txt输出foo.txt。
dirname
展开~
~展开环境变量路径
获得 link 的真实路径
计算相对路径
分割文件和扩展名
Base64 编码
UUID
转换类型
使用复杂变量列表中每个项目的属性
从字符串获取日期
使用字符串格式化日期
组合过滤
返回组合列表的列表:
debugging 过滤
Tests
测试语法
测试语法和过滤语法(variable | filte)不同。在 Ansible 2.5 之后,使用 jinja2 测试将会显示警告。
语法:
或:
测试字符串
匹配字符串:
match要求完全匹配字符串,而search仅需要匹配字符串的子集。
版本比较
操作符:
严格版本解析:
集合测试
子集和超集
全真或至少一个真
路径测试
任务结果测试
Last updated
Was this helpful?