ansible - 如何在 Ansible(Jinja2 模板)中修复“假”被评估为真
问题描述
如何确保 Ansible 戏剧/角色中使用的 Jinja2 模板易于"false"
被评估True
?
背景:
Ansible 中的布尔处理很棘手,与 Jinja2 模板一起使用时可能会导致意外结果。
事实证明 Ansible 处理不同的"false"
值:
- 当在
when
子句中使用时,它的计算结果为False
- 在 Jinja2 模板中使用时,它的计算结果为
True
看看这个简单的例子:
---
- name: Sample play
hosts: localhost
gather_facts: false
vars:
enabled: 'false'
tasks:
- name: Print enabled / disabled with Jinja2 inline condition
debug:
msg: "{{ 'enabled' if enabled else 'disabled' }}"
- name: Print enabled
debug:
msg: Enabled
when: enabled
enabled
即使变量 is打印第一个任务'false'
,第二个任务也会跳过:
PLAY [Sample play] *********************************************************************************************************************************************************************
TASK [Print enabled / disabled with Jinja2 inline condition] ***************************************************************************************************************************
ok: [localhost] => {
"msg": "enabled"
}
TASK [Print enabled] *******************************************************************************************************************************************************************
skipping: [localhost]
解决方案
您可以使用两种方法来确保在 Jinja2 模板"false"
中进行评估:False
1.使用bool
过滤器
bool
当使用布尔类型的变量时, 只需将过滤器添加到每个 Jinja2 条件:
---
- hosts: localhost
gather_facts: false
tasks:
- debug:
msg: "{{ 'enabled' if item | bool else 'disabled' }}"
with_items:
- "true"
- "false"
- true
- false
结果是:
TASK [debug] ***************************************************************************************************************************************************************************
ok: [localhost] => (item=true) => {
"msg": "enabled"
}
ok: [localhost] => (item=false) => {
"msg": "disabled"
}
ok: [localhost] => (item=True) => {
"msg": "enabled"
}
ok: [localhost] => (item=False) => {
"msg": "disabled"
}
或者在模板文件中:
{% if enabled | bool %}
# ...
{% endif %}
2.使用断言
您还可以强制变量值是布尔值而不是带有断言的字符串:
- assert:
that:
- enabled == enabled | bool
# or you may use `type_debug` filter
- enable | type_debug == 'bool'
只需在您的 Ansible 角色/剧本的开头添加此内容。true
如果变量不是 a或,它将失败false
。
对于这部剧:
---
- hosts: localhost
gather_facts: false
tasks:
- assert:
that:
- item == item | bool
with_items:
- "true"
- "false"
- true
- false
只有true
和false
通过,"true"
和"false"
被拒绝:
TASK [assert] **************************************************************************************************************************************************************************
failed: [localhost] (item=true) => {
"assertion": "item == item | bool",
"changed": false,
"evaluated_to": false,
"item": "true"
}
failed: [localhost] (item=false) => {
"assertion": "item == item | bool",
"changed": false,
"evaluated_to": false,
"item": "false"
}
ok: [localhost] => (item=True) => {
"changed": false,
"item": true,
"msg": "All assertions passed"
}
ok: [localhost] => (item=False) => {
"changed": false,
"item": false,
"msg": "All assertions passed"
}
推荐阅读
- android - Xamarin 表单:如何为 Amazone Fire TV 开发应用程序
- c - printf 在这里做了什么?
- css - 仅在 Internet Explorer 中出现的引导对齐错误
- c# - Microsoft SQL Server:插入列表问题;混淆了列表
- c# - 如何使用 REGEX C# 查找 LinkedIn 用户的 Web 链接
- c++ - 无法通过 OpenCV 和 C++ 获得我的网络摄像头支持的最大 30 fps
- javascript - 为什么我的 setInterval 函数在我的对象中不起作用?
- html - 在元素上指定尺寸并以 A4 纸格式显示页面
- sql - 如果外键不存在,则将该字段设置为 NULL
- c++ - 如何创建具有唯一名称的文件?