有人能解释 Ansible 中的以下 Jinja 行为吗?
以下代码有效:跳过该任务,因为 job_function 不在 rejection_functions 数组中
- name: Lowercase test
hosts: localhost
gather_facts: false
vars:
job_function: 'VRIJwillig'
exclusion_functions:
- vrijwilliger
- maatje
tasks:
- name: Test for function in exclusions
debug:
msg: In exclusions
when: (job_function | lower) in exclusion_functions
以下代码同样有效,第二个任务被跳过。
- name: Lowercase test
hosts: localhost
gather_facts: false
vars:
job_function: 'VRIJwillig'
exclusion_functions:
- Vrijwilliger
- Maatje
tasks:
- name: Initialiseer variabelen
set_fact:
exclusions: "{{ exclusion_functions | lower }}"
- name: Test for function in exclusions
debug:
msg: In exclusions
when: (job_function | lower) in exclusions
但这不起作用,任务没有被跳过:
---
- name: Lowercase test
hosts: localhost
gather_facts: false
vars:
job_function: 'VRIJwillig'
exclusion_functions:
- Vrijwilliger
- Maatje
tasks:
- name: Test for function in exclusions
debug:
msg: In exclusions
when: (job_function | lower) in (exclusion_functions | lower)
为什么在最后一段代码中没有跳过任务?job_function | lower
是vrijwillig
,并且exclusion_functions | lower
是['vrijwilliger','maatje']
,而第一个不在第二个中。
变量exclusion_functions的值是一个列表
给出
过滤器lower将参数转换为字符串
输出看起来像一个列表,但实际上不是。它是一个字符串
这解释了为什么下面的任务没有被跳过
VRIJwillig
变量job_function的值被转换为小写,vrijwillig
即字符串['vrijwilliger', 'maatje']
解决方案是将过滤器映射到每个列表的项目下方
显示结果是将项目转换为小写的列表
然后,正如预期的那样,下面的任务被跳过
完整测试剧本的示例
我无法回答
问:“有人能解释一下 Ansible 中 Jinja 的以下行为吗? ”
为了在列表中搜索(子)字符串,我建议使用以下最小示例剧本中的方法
输出结果为
因为
search
测试 – 字符串是否匹配正则表达式已经有一个参数:ignorecase
。在示例中查看结果如果要查找列表元素的完全匹配,请使用
contains
测试 - 列表是否包含此元素导致跳过任务。
或者使用已经给出的答案。