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填充:

快速生成字典

items2dictdict

从:

到:

子元素过滤

生成一个对象的乘积和该对象的子元素值:

从:

到:

使用 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

展开~

展开环境变量路径

计算相对路径

分割文件和扩展名

Base64 编码

UUID

转换类型

使用复杂变量列表中每个项目的属性

从字符串获取日期

使用字符串格式化日期

组合过滤

返回组合列表的列表:

debugging 过滤

Tests

测试语法

测试语法和过滤语法(variable | filte)不同。在 Ansible 2.5 之后,使用 jinja2 测试将会显示警告。

语法:

或:

测试字符串

匹配字符串:

match要求完全匹配字符串,而search仅需要匹配字符串的子集。

版本比较

操作符:

严格版本解析:

集合测试

子集和超集

全真或至少一个真

路径测试

任务结果测试

Templating (Jinja2)

Last updated

Was this helpful?