Ansible templates 使用介绍

环境信息

  • ansible-core 2.16
  • Docker image python:3.12.3
Ansible 安装部署参考 Ansible playbook 使用介绍

Ansible 使用 Jinja2 模板语言对变量或者 Facts 进行模板化。 [1]

模板数据处理

Filters

使用 Filters 可以进行数据转换(如 JSON –> YAML)、URL 分割等操作。 [2]

为变量提供默认值

在模板中使用的变量未定义的情况下,可能会导致 Ansible 处理失败,为了以更优雅的方式处理此类问题,可以在模板中为变量提供 默认值

{{ some_variable | default(5) }}

也可以在变量计算值为空或者 false 时使用默认值

{{ lookup('env', 'MY_USER') | default('admin', true) }}

配置变量为可选变量

默认情况下,Ansible Template 中所有的变量都必须有值,否则会抛出异常。假如需要在模板中的部分变量没有值或未定义的情况下也可以正常部署,可以将其配置为 可选(optional)

要将变量配置为 **可选(optional)**,可以将其 默认值(default value) 设置为特殊变量 omit

- name: Touch files with an optional mode
ansible.builtin.file:
dest: "{{ item.path }}"
state: touch
mode: "{{ item.mode | default(omit) }}"
loop:
- path: /tmp/foo
- path: /tmp/bar
- path: /tmp/baz
mode: "0444"

变量类型

如果需要对变量类型进行转换,可以参考以下方法

获取变量类型

2.3 以上版本中,可以使用 type_debug 显示变量类型

{{ myvar | type_debug }}

字典转换为列表

New in version 2.6.

{{ dict | dict2items }}

原始字典数据:

tags:
Application: payment
Environment: dev

使用 {{ dict | dict2items }} 转换后的列表数据:

- key: Application
value: payment
- key: Environment
value: dev

转换后的列表默认以关键字 key 指示之前的字典中的 key 值,以关键字 value 指示之前的字典中的 value 值。如果想要自定义 key 名称,dict2items 接受关键字参数 key_namevalue_name

# Dictionary data (before applying the ansible.builtin.dict2items filter):
files:
users: /etc/passwd
groups: /etc/group

# applying the ansible.builtin.dict2items filter
{{ files | dict2items(key_name='file', value_name='path') }}

# List data (after applying the ansible.builtin.dict2items filter):
- file: users
path: /etc/passwd
- file: groups
path: /etc/group

列表转换为字典

{{ tags | items2dict }}

List data (before applying the ansible.builtin.items2dict filter):

tags:
- key: Application
value: payment
- key: Environment
value: dev

Dictionary data (after applying the ansible.builtin.items2dict filter):

Application: payment
Environment: dev

假如 List Data 中的关键字不是 keyvalue,此时必须使用参数 key_namevalue_name 指定

{{ fruits | items2dict(key_name='fruit', value_name='color') }}

强制类型转换

使用以下语法强制转换变量数据类型 [5]

some_string_value | bool

ansible_facts['os_family'] == "RedHat" and ansible_facts['lsb']['major_release'] | int

YAML 和 JSON 数据转换

可以使用以下语法将数据转换为 JSON 或者 YAML 格式

{{ some_variable | to_json }}
{{ some_variable | to_yaml }}

可以使用以下语法将数据转换为方便人类阅读 JSON 或者 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) }}

参考链接

Templating (Jinja2)

脚注